using System; using System.Collections.Generic; namespace Developpez.Dotnet.Collections { /// /// Comparateur d'égalité qui comparer des objets selon la clé spécifiée /// /// Type des objets comparés /// Type de la clé de comparaison public class KeyEqualityComparer : IEqualityComparer { private readonly Func _keySelector; private readonly IEqualityComparer _keyComparer; /// /// Crée une nouvelle instance de KeyEqualityComparer /// /// Fonction qui renvoie la clé à partir d'un objet public KeyEqualityComparer(Func keySelector) : this(keySelector, null) { } /// /// Crée une nouvelle instance de KeyEqualityComparer /// /// Fonction qui renvoie la clé à partir d'un objet /// Comparateur à utiliser pour tester l'égalité de 2 clés. /// Si keyComparer est null, le comparateur par défaut est utilisé. public KeyEqualityComparer(Func keySelector, IEqualityComparer keyComparer) { keySelector.CheckArgumentNull("keySelector"); keyComparer = keyComparer ?? EqualityComparer.Default; _keySelector = keySelector; _keyComparer = keyComparer; } /// /// Détermine si les objets spécifiés sont égaux. /// /// Le premier objet à comparer /// Le deuxième objet à comparer /// true si les objets spécifiés sont égaux ; sinon, false. public bool Equals(T x, T y) { return _keyComparer.Equals(_keySelector(x), _keySelector(y)); } /// /// Retourne un code de hachage pour l'objet spécifié. /// /// Objet pour lequel un code de hachage doit être retourné. /// Code de hachage pour l'objet spécifié. public int GetHashCode(T obj) { return _keyComparer.GetHashCode(_keySelector(obj)); } } /// /// Classe statique pour faciliter la création de KeyEqualityComparer quand le type de la clé est anonyme /// /// Type des objets comparés public static class KeyEqualityComparer { /// /// Crée un KeyEqualityComparer qui utilise la clé spécifié /// /// Type de la clé /// Fonction qui renvoie la clé à partir d'un objet /// Un comparateur d'égalité qui utilise la clé spécifiée public static IEqualityComparer Create(Func keySelector) { return Create(keySelector, null); } /// /// Crée un KeyEqualityComparer qui utilise la clé spécifié /// /// Type de la clé /// Fonction qui renvoie la clé à partir d'un objet /// Comparateur à utiliser pour tester l'égalité de 2 clés. /// Un comparateur d'égalité qui utilise la clé spécifiée /// Si keyComparer est null, le comparateur par défaut est utilisé. public static IEqualityComparer Create(Func keySelector, IEqualityComparer keyComparer) { return new KeyEqualityComparer(keySelector, keyComparer); } } /// /// Classe statique pour faciliter la création de KeyEqualityComparer pour des objets de type anonyme /// public static class KeyEqualityComparer { /// /// Crée un KeyEqualityComparer qui utilise la clé spécifié /// /// Type des objets comparés /// Type de la clé /// Objet modèle pour déterminer le type des objets comparés /// Fonction qui renvoie la clé à partir d'un objet /// Un comparateur d'égalité qui utilise la clé spécifiée public static IEqualityComparer Create(T dummy, Func keySelector) { return Create(dummy, keySelector, null); } /// /// Crée un KeyEqualityComparer qui utilise la clé spécifié /// /// Type des objets comparés /// Type de la clé /// Objet modèle pour déterminer le type des objets comparés /// Fonction qui renvoie la clé à partir d'un objet /// Comparateur à utiliser pour tester l'égalité de 2 clés. /// Un comparateur d'égalité qui utilise la clé spécifiée /// Si keyComparer est null, le comparateur par défaut est utilisé. public static IEqualityComparer Create(T dummy, Func keySelector, IEqualityComparer keyComparer) { return new KeyEqualityComparer(keySelector, keyComparer); } } }