Ecco il comparatore di uguaglianza che ho appena scritto perché volevo un insieme distinto di elementi da un elenco contenente entità.Domande su 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();
}
}
- Perché
Distinct
richiede un operatore di confronto in contrapposizione ad unFunc<T,T,bool>
? - Sono (A) e (B) qualcosa di diverso dalle ottimizzazioni e ci sono scenari in cui non agiscono nel modo previsto, a causa della sottigliezza nel confronto dei riferimenti?
Se avessi voluto, avrei potuto sostituire (C) con
return GetHashCode(x) == GetHashCode(y)
casuale auto-agrandizing osservazione: questo potrebbe fare un buon esame quetion –