Qual è la differenza tra LINQ ToDictionary e ToLookup


123

Qual è la differenza tra LINQ ToDictionary e ToLookup? Sembrano fare la stessa cosa.

Risposte:


176

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>>


5
Anche in qualche modo simile a un groupby?
Carlo V. Dango

7
È il comportamento di una ricerca che restituisce una sequenza vuota per una parte chiave mancante del contratto standard di ILookup<,>o è un'implementazione libera di lanciare un file KeyNotFoundException. L' implementazione in Rx genera un file KeyNotFoundException.
Lukazoid

Nel caso in cui aiuti qualcuno: 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.
Nate Cook il

-4

ToDictionary è <TKey, TValue> mentre ToLookup <TKey, T1, T2, T3, ...> è simile a IGrouping ma l'enumerazione rimane in memoria.


3
Non sei sicuro di cosa stai cercando di illustrare con il T1, T2, T3, ...; ToLookup e ToDictionary (i metodi stessi) hanno praticamente la stessa API
Marc Gravell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.