Bon, j'ai donc un énumérable et je souhaite en obtenir des valeurs distinctes.
En utilisant System.Linq
, il y a bien sûr une méthode d'extension appelée Distinct
. Dans le cas simple, il peut être utilisé sans paramètres, comme:
var distinctValues = myStringList.Distinct();
C'est bien, mais si j'ai une liste d'objets pour lesquels je dois spécifier l'égalité, la seule surcharge disponible est:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
L'argument du comparateur d'égalité doit être une instance de IEqualityComparer<T>
. Je peux le faire, bien sûr, mais c'est un peu bavard et, bien, grossier.
Ce à quoi je m'attendais, c'est une surcharge qui prendrait un lambda, disons un Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Quelqu'un sait-il si une telle extension existe, ou une solution de contournement équivalente? Ou est-ce que je manque quelque chose?
Sinon, existe-t-il un moyen de spécifier une ligne IEqualityComparer (embarrassez-moi)?
Mise à jour
J'ai trouvé une réponse d'Anders Hejlsberg à un message dans un forum MSDN sur ce sujet. Il dit:
Le problème que vous allez rencontrer est que lorsque deux objets sont comparables, ils doivent avoir la même valeur de retour GetHashCode (sinon la table de hachage utilisée en interne par Distinct ne fonctionnera pas correctement). Nous utilisons IEqualityComparer car il regroupe les implémentations compatibles de Equals et GetHashCode dans une seule interface.
Je suppose que cela a du sens ..