Quelle est la différence entre LINQ ToDictionary et ToLookup? Ils semblent faire la même chose.
Quelle est la différence entre LINQ ToDictionary et ToLookup? Ils semblent faire la même chose.
Réponses:
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>>
ILookup<,>
ou une implémentation libre de lancer un KeyNotFoundException
. L' implémentation dans Rx lance un KeyNotFoundException
.
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.
ToDictionary est <TKey, TValue> tandis que ToLookup <TKey, T1, T2, T3, ...> est similaire à IGrouping mais l'énumération reste en mémoire.
T1, T2, T3, ...
; ToLookup et ToDictionary (les méthodes elles-mêmes) ont à peu près la même API