Bene, quindi ho un enumerabile e desidero ottenere valori distinti da esso.
Utilizzando System.Linq
, c'è ovviamente un metodo di estensione chiamato Distinct
. Nel caso semplice, può essere utilizzato senza parametri, come:
var distinctValues = myStringList.Distinct();
Bene e buono, ma se ho un elenco numeroso di oggetti per i quali devo specificare l'uguaglianza, l'unico sovraccarico disponibile è:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
L'argomento del comparatore di uguaglianza deve essere un'istanza di IEqualityComparer<T>
. Posso farlo, ovviamente, ma è un po 'prolisso e, beh, rozzo.
Quello che mi sarei aspettato è un sovraccarico che richiederebbe un lambda, diciamo Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Qualcuno sa se esiste una tale estensione o una soluzione alternativa equivalente? Oppure mi sfugge qualcosa?
In alternativa, c'è un modo per specificare un IEqualityComparer inline (imbarazzami)?
Aggiornare
Ho trovato una risposta di Anders Hejlsberg a un post in un forum MSDN su questo argomento. Lui dice:
Il problema che incontrerai è che quando due oggetti si equivalgono devono avere lo stesso valore di ritorno GetHashCode (altrimenti la tabella hash utilizzata internamente da Distinct non funzionerà correttamente). Utilizziamo IEqualityComparer perché integra implementazioni compatibili di Equals e GetHashCode in un'unica interfaccia.
Suppongo abbia senso..