Creazione di classe anonima come la chiave personalizzata in dizionario
-
23-09-2019 - |
Domanda
Durante l'utilizzo di dizionario, ho sempre la priorità GetHashCode e Equals (o fornire un operatore di confronto personalizzato al dizionario).
Che cosa accade dietro le coperte quando creo una classe anonima come la chiave?
Codice di esempio ....
var groups=(from item in items
group item by new { item.ClientId, item.CustodianId, item.CurrencyId }
into g
select new {
Key=g.Key,
Sum=g.Sum(x => x.Cash)
}).ToDictionary(item=>item.Key,item=>item.Sum);
Questo codice mi dà il risultato atteso, ma io non sono fornendo GetHashCode e Equals metodo per la classe anonima. Non dovrebbe questo codice non riescono a gruppo miei oggetti sulla base di elementi nella classe anonima ??
Soluzione
No -. La classe anonima genera automaticamente Equals appropriate / implementazioni GetHashCode
Dal linguaggio C # spec, sezione 7.5.10.6:
I Equals e metodi GetHashCode su tipi anonimi sostituiscono i metodi ereditato da oggetto, e sono definiti in termini di Equals e GetHashCode delle proprietà, in modo che due istanze dello stesso tipo anonimo sono uguali se e solo se tutti i loro proprietà sono uguali.