Was ist der Unterschied zwischen LINQ ToDictionary und ToLookup?

123

Was ist der Unterschied zwischen LINQ ToDictionary und ToLookup? Sie scheinen dasselbe zu tun.

Carlo V. Dango
quelle

Antworten:

176

Ein Wörterbuch ist eine 1: 1-Zuordnung (jeder Schlüssel ist einem einzelnen Wert zugeordnet), und ein Wörterbuch kann nachträglich geändert (bearbeitet) werden.

Eine Suche ist eine 1: viele-Zuordnung (Multi-Map; jeder Schlüssel wird einem IEnumerable<>der Werte mit diesem Schlüssel zugeordnet), und es gibt keine Mutation auf der ILookup<,>Schnittstelle.

Als Randnotiz können Sie eine Suche (über den Indexer) nach einem nicht vorhandenen Schlüssel abfragen, und Sie erhalten eine leere Sequenz. Wenn Sie dasselbe mit einem Wörterbuch tun, erhalten Sie eine Ausnahme.

Also: Wie viele Datensätze teilen sich jeden Schlüssel?

Eine zu vereinfachte Sichtweise ist, dass a Lookup<TKey,TValue>in etwa mit a vergleichbar istDictionary<TKey,IEnumerable<TValue>>

Marc Gravell
quelle
5
Auch etwas ähnlich wie ein Groupby?
Carlo V. Dango
7
Gibt das Verhalten einer Suche eine leere Sequenz für einen fehlenden Schlüsselteil des Standardvertrags zurück ILookup<,>oder ist eine Implementierung frei, eine zu werfen KeyNotFoundException. Die Implementierung in Rx wirft a KeyNotFoundException.
Lukazoid
Falls es jemandem hilft: Dictionary<TKey, IEnumerable<TValue>>könnte als ein Wörterbuch von Listen beschrieben werden. Das ToLookup()ist so, als würde man sagen: Gib mir ein Wörterbuch mit Listen. Aus irgendeinem Grund half es mir, es so zu hören, dass es mir klar wurde.
Nate Cook
-4

ToDictionary ist <TKey, TValue>, während ToLookup <TKey, T1, T2, T3, ...> IGrouping ähnelt, die Aufzählung jedoch im Speicher bleibt.

Bonshington
quelle
3
Nicht ganz sicher, was Sie mit dem zu veranschaulichen versuchen T1, T2, T3, ...; ToLookup und ToDictionary (die Methoden selbst) haben
fast