Jaka jest różnica między LINQ ToDictionary i ToLookup? Wydaje się, że robią to samo.
123
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>>
ILookup<,>
lub jest implementacją, która może rzucićKeyNotFoundException
. Realizacja w Rx rzucaKeyNotFoundException
.Dictionary<TKey, IEnumerable<TValue>>
można by je opisać jako słownik list. ToToLookup()
tak, jakby powiedzieć: daj mi słownik list. Z jakiegoś powodu usłyszenie tego w ten sposób pomogło mi w zrozumieniu tego.ToDictionary to <TKey, TValue>, podczas gdy ToLookup <TKey, T1, T2, T3, ...> jest podobne do IGrouping, ale wyliczenie pozostaje w pamięci.
źródło
T1, T2, T3, ...
; ToLookup i ToDictionary (same metody) mają prawie to samo API