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