Jaka jest różnica między LINQ ToDictionary i ToLookup

123

Jaka jest różnica między LINQ ToDictionary i ToLookup? Wydaje się, że robią to samo.

Carlo V. Dango
źródło

Odpowiedzi:

177

Słownik to mapa 1: 1 (każdy klucz jest przypisany do pojedynczej wartości), a słownik jest zmienny (edytowalny) po fakcie.

Wyszukiwanie jest mapą 1: many (multi-map; każdy klucz jest mapowany na jedną IEnumerable<>z wartości z tym kluczem) i nie ma mutacji w ILookup<,>interfejsie.

Na marginesie, możesz wysłać zapytanie (przez indeksator) do klucza, który nie istnieje, a otrzymasz pustą sekwencję. Zrób to samo ze słownikiem, a otrzymasz wyjątek.

A więc: ile rekordów ma wspólny klucz?

Zbyt uproszczony sposób patrzenia na to polega na tym, że a Lookup<TKey,TValue>jest z grubsza porównywalne z aDictionary<TKey,IEnumerable<TValue>>

Marc Gravell
źródło
5
Również trochę podobny do grupy?
Carlo V. Dango,
7
Czy zachowanie wyszukiwania zwracającego pustą sekwencję dla brakującej kluczowej części standardowego kontraktu ILookup<,>lub jest implementacją, która może rzucić KeyNotFoundException. Realizacja w Rx rzuca KeyNotFoundException.
Lukazoid
Na wypadek, gdyby to komukolwiek pomogło: Dictionary<TKey, IEnumerable<TValue>>można by je opisać jako słownik list. To ToLookup()tak, jakby powiedzieć: daj mi słownik list. Z jakiegoś powodu usłyszenie tego w ten sposób pomogło mi w zrozumieniu tego.
Nate Cook,
-4

ToDictionary to <TKey, TValue>, podczas gdy ToLookup <TKey, T1, T2, T3, ...> jest podobne do IGrouping, ale wyliczenie pozostaje w pamięci.

Bonshington
źródło
3
Nie do końca jestem pewien, co próbujesz zilustrować za pomocą T1, T2, T3, ...; ToLookup i ToDictionary (same metody) mają prawie to samo API
Marc Gravell