Aquí está el comparador de igualdad que acabo de escribir porque quería un conjunto distinto de elementos de una lista que contiene entidades.Preguntas sobre IEqualityComparer <T>/List <T> .Distinct()
class InvoiceComparer : IEqualityComparer<Invoice>
{
public bool Equals(Invoice x, Invoice y)
{
// A
if (Object.ReferenceEquals(x, y)) return true;
// B
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false;
// C
return x.TxnID == y.TxnID;
}
public int GetHashCode(Invoice obj)
{
if (Object.ReferenceEquals(obj, null)) return 0;
return obj.TxnID2.GetHashCode();
}
}
- ¿Por qué
Distinct
requieren un comparador en contraposición a unFunc<T,T,bool>
? - ¿Están (A) y (B) algo distinto a las optimizaciones, y hay situaciones en las que no actuarían de la manera esperada, debido a la sutileza en la comparación de referencias?
Si quisiera, podría reemplazar a (C) con
return GetHashCode(x) == GetHashCode(y)
observación aleatoria autoevaluada: esto podría hacer una buena consulta –