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);
}
}
}