Quelle est la différence entre LINQ ToDictionary et ToLookup


123

Quelle est la différence entre LINQ ToDictionary et ToLookup? Ils semblent faire la même chose.

Réponses:


176

Un dictionnaire est une carte 1: 1 (chaque clé est mappée à une seule valeur), et un dictionnaire est mutable (modifiable) après coup.

Une recherche est une carte 1: plusieurs (multi-carte; chaque clé est mappée à l'une IEnumerable<>des valeurs avec cette clé), et il n'y a pas de mutation sur l' ILookup<,>interface.

En remarque, vous pouvez interroger une recherche (via l'indexeur) sur une clé qui n'existe pas, et vous obtiendrez une séquence vide. Faites de même avec un dictionnaire et vous obtiendrez une exception.

Alors: combien d'enregistrements partagent chaque clé?

Une façon trop simplifiée de voir les choses est que a Lookup<TKey,TValue>est à peu près comparable à unDictionary<TKey,IEnumerable<TValue>>


5
Également un peu similaire à un groupby?
Carlo V. Dango

7
Le comportement d'une recherche renvoyant une séquence vide pour une partie clé manquante du contrat standard de ILookup<,>ou une implémentation libre de lancer un KeyNotFoundException. L' implémentation dans Rx lance un KeyNotFoundException.
Lukazoid

Au cas où cela aiderait n'importe qui: Dictionary<TKey, IEnumerable<TValue>>pourrait être décrit comme un dictionnaire de listes. C'est ToLookup()comme dire: donnez-moi un dictionnaire de listes. Pour une raison quelconque, l'entendre décrit de cette façon m'a aidé à le comprendre directement dans ma tête.
Nate Cook

-4

ToDictionary est <TKey, TValue> tandis que ToLookup <TKey, T1, T2, T3, ...> est similaire à IGrouping mais l'énumération reste en mémoire.


3
Je ne sais pas trop ce que vous essayez d’illustrer avec le T1, T2, T3, ...; ToLookup et ToDictionary (les méthodes elles-mêmes) ont à peu près la même API
Marc Gravell
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.