Qual è la differenza tra LINQ ToDictionary e ToLookup? Sembrano fare la stessa cosa.
Qual è la differenza tra LINQ ToDictionary e ToLookup? Sembrano fare la stessa cosa.
Risposte:
Un dizionario è una mappa 1: 1 (ogni chiave è mappata su un singolo valore) e un dizionario è mutabile (modificabile) dopo il fatto.
Una ricerca è una mappa 1: molti (multi-mappa; ogni chiave è mappata su uno IEnumerable<>
dei valori con quella chiave) e non ci sono mutazioni ILookup<,>
sull'interfaccia.
Come nota a margine, puoi eseguire una query di ricerca (tramite l'indicizzatore) su una chiave che non esiste e otterrai una sequenza vuota. Fai lo stesso con un dizionario e otterrai un'eccezione.
Quindi: quanti record condividono ogni chiave?
Un modo eccessivamente semplificato di vederlo è che a Lookup<TKey,TValue>
è più o meno paragonabile ad aDictionary<TKey,IEnumerable<TValue>>
ILookup<,>
o è un'implementazione libera di lanciare un file KeyNotFoundException
. L' implementazione in Rx genera un file KeyNotFoundException
.
Dictionary<TKey, IEnumerable<TValue>>
potrebbe essere descritto come un dizionario di elenchi. Quindi ToLookup()
è come dire: dammi un dizionario di elenchi. Per qualche ragione sentirlo descritto in quel modo mi ha aiutato a metterlo dritto nella mia testa.
ToDictionary è <TKey, TValue> mentre ToLookup <TKey, T1, T2, T3, ...> è simile a IGrouping ma l'enumerazione rimane in memoria.
T1, T2, T3, ...
; ToLookup e ToDictionary (i metodi stessi) hanno praticamente la stessa API