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.

Carlo V. Dango
la source

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

Marc Gravell
la source
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.

Bonshington
la source
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