using System; using System.Collections.Generic; namespace Developpez.Dotnet.Collections { /// /// Comparateur qui compare des objets selon la clé spécifiée /// /// Type des objets comparés /// Type de la clé de comparaison public class KeyComparer : IComparer { private readonly Func _keySelector; private readonly IComparer _keyComparer; /// /// Crée une nouvelle instance de . /// /// Fonction qui renvoie la clé à partir d'un objet public KeyComparer(Func keySelector) : this(keySelector, null) { } /// /// Crée une nouvelle instance de . /// /// Fonction qui renvoie la clé à partir d'un objet /// /// Comparateur à utiliser pour comparer 2 clés. /// Si keyComparer est null, le comparateur par défaut est utilisé. public KeyComparer(Func keySelector, IComparer keyComparer) { keySelector.CheckArgumentNull("keySelector"); _keySelector = keySelector; _keyComparer = keyComparer ?? Comparer.Default; } /// /// Compare deux objets et retourne une valeur indiquant si l'un d'entre eux est inférieur, égal ou supérieur à l'autre. /// /// Premier objet à comparer /// Second objet à comparer /// Entier signé qui indique les valeurs relatives de x et y, comme indiqué dans le tableau suivant. /// /// /// Valeur /// Signification /// /// /// Inférieure à zéro /// x est inférieur à y. /// /// /// Zéro /// x est égal à y. /// /// /// Supérieure à zéro /// x est supérieur à y. /// /// /// public int Compare(T x, T y) { return _keyComparer.Compare(_keySelector(x), _keySelector(y)); } } /// /// Classe statique pour faciliter la création de KeyComparer quand le type de la clé est anonyme /// /// Type des objets comparés public static class KeyComparer { /// /// Crée un KeyComparer qui utilise la clé spécifié /// /// Type de la clé /// Fonction qui renvoie la clé à partir d'un objet /// Un comparateur qui utilise la clé spécifiée public static IComparer Create(Func keySelector) { return Create(keySelector, null); } /// /// Crée un KeyComparer qui utilise la clé spécifié /// /// Type de la clé /// Fonction qui renvoie la clé à partir d'un objet /// Comparateur à utiliser pour comparer 2 clés. /// Un comparateur qui utilise la clé spécifiée /// Si keyComparer est null, le comparateur par défaut est utilisé. public static IComparer Create(Func keySelector, IComparer keyComparer) { return new KeyComparer(keySelector, keyComparer); } } /// /// Classe statique pour faciliter la création de KeyComparer pour des objets de type anonyme /// public static class KeyComparer { /// /// Crée un KeyComparer 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 qui utilise la clé spécifiée public static IComparer Create(T dummy, Func keySelector) { return Create(dummy, keySelector, null); } /// /// Crée un KeyComparer 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 comparer de 2 clés. /// Un comparateur qui utilise la clé spécifiée /// Si keyComparer est null, le comparateur par défaut est utilisé. public static IComparer Create(T dummy, Func keySelector, IComparer keyComparer) { return new KeyComparer(keySelector, keyComparer); } } }