В чем разница между LINQ ToDictionary и ToLookup

123

В чем разница между LINQ ToDictionary и ToLookup? Кажется, они делают то же самое.

Карло В. Данго
источник

Ответы:

177

Словарь представляет собой карту 1: 1 (каждый ключ отображается на одно значение), а словарь является изменяемым (редактируемым) постфактум.

Поиск - это карта 1: многие (мульти-карта; каждый ключ сопоставляется с одним IEnumerable<>из значений с этим ключом), и в ILookup<,>интерфейсе нет изменений.

В качестве побочного примечания вы можете запросить поиск (через индексатор) по несуществующему ключу, и вы получите пустую последовательность. Сделайте то же самое со словарем, и вы получите исключение.

Итак: сколько записей разделяет каждый ключ?

Чрезмерно упрощенный способ смотреть на него в том , что Lookup<TKey,TValue>это примерно сопоставимы с аDictionary<TKey,IEnumerable<TValue>>

Марк Гравелл
источник
5
Также чем-то похож на groupby?
Карло В. Данго
7
Является ли поведение поиска, возвращающим пустую последовательность для отсутствующей ключевой части стандартного контракта, ILookup<,>или реализация, которая может генерировать файл KeyNotFoundException. Реализация в Rx бросает KeyNotFoundException.
Lukazoid
В случае, если это кому-то поможет: Dictionary<TKey, IEnumerable<TValue>>можно описать как словарь списков. Так ToLookup(), как говорят: дайте мне словарь списков. По какой-то причине, когда я услышал об этом так, это помогло мне прочувствовать это в моей голове.
Нейт Кук,
-4

ToDictionary - это <TKey, TValue>, а ToLookup <TKey, T1, T2, T3, ...> аналогичен IGrouping, но перечисление остается в памяти.

Bonshington
источник
3
Не совсем уверен, что вы пытаетесь проиллюстрировать с помощью T1, T2, T3, ...; ToLookup и ToDictionary (сами методы) имеют примерно одинаковый API
Марк Грейвелл