Bien, entonces tengo un enumerable y deseo obtener valores distintos de él.
Usando System.Linq
, por supuesto, hay un método de extensión llamado Distinct
. En el caso simple, se puede usar sin parámetros, como:
var distinctValues = myStringList.Distinct();
Bien y bien, pero si tengo un número de objetos para los que necesito especificar igualdad, la única sobrecarga disponible es:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
El argumento del comparador de igualdad debe ser una instancia de IEqualityComparer<T>
. Puedo hacer esto, por supuesto, pero es algo detallado y, bueno, deslucido.
Lo que hubiera esperado es una sobrecarga que tomaría una lambda, digamos una Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
¿Alguien sabe si existe alguna extensión de este tipo, o alguna solución alternativa equivalente? ¿O me estoy perdiendo algo?
Alternativamente, ¿hay alguna forma de especificar un IEqualityComparer en línea (me avergüenza)?
Actualizar
Encontré una respuesta de Anders Hejlsberg a una publicación en un foro de MSDN sobre este tema. Él dice:
El problema con el que se encontrará es que cuando dos objetos se comparan iguales, deben tener el mismo valor de retorno GetHashCode (o la tabla hash utilizada internamente por Distinct no funcionará correctamente). Utilizamos IEqualityComparer porque empaqueta implementaciones compatibles de Equals y GetHashCode en una sola interfaz.
Supongo que tiene sentido..