Quelle est la différence entre LINQ ToDictionary et ToLookup? Ils semblent faire la même chose.
123
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 unKeyNotFoundException
. L' implémentation dans Rx lance unKeyNotFoundException
.Dictionary<TKey, IEnumerable<TValue>>
pourrait être décrit comme un dictionnaire de listes. C'estToLookup()
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.
la source
T1, T2, T3, ...
; ToLookup et ToDictionary (les méthodes elles-mêmes) ont à peu près la même API