Certo, então eu tenho um enumerável e desejo obter valores distintos dele.
Usando System.Linq
, é claro que existe um método de extensão chamado Distinct
. No caso simples, pode ser usado sem parâmetros, como:
var distinctValues = myStringList.Distinct();
Muito bem, mas se eu tiver um grande número de objetos para os quais preciso especificar igualdade, a única sobrecarga disponível é:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
O argumento comparador de igualdade deve ser uma instância de IEqualityComparer<T>
. Eu posso fazer isso, é claro, mas é um pouco detalhado e, bem, desajeitado.
O que eu esperava era uma sobrecarga que levaria um lambda, digamos um Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Alguém sabe se existe alguma extensão ou alguma solução alternativa? Ou eu estou esquecendo de alguma coisa?
Como alternativa, existe uma maneira de especificar um inline IEqualityComparer (me envergonhar)?
Atualizar
Encontrei uma resposta de Anders Hejlsberg em uma postagem em um fórum do MSDN sobre esse assunto. Ele diz:
O problema que você encontrará é que, quando dois objetos se comparam da mesma forma, eles devem ter o mesmo valor de retorno GetHashCode (ou a tabela de hash usada internamente pelo Distinct não funcionará corretamente). Usamos IEqualityComparer porque empacota implementações compatíveis de Equals e GetHashCode em uma única interface.
Suponho que faz sentido ..
.Distinct(new KeyEqualityComparer<Customer,string>(c1 => c1.CustomerId))
, e explicar por que GetHashCode () é importante para o trabalho corretamente.