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

#c# #linq

#c# #linq

Вопрос:

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

Ответ №1:

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

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

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

Итак: сколько записей совместно используют каждый ключ?

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

Комментарии:

1. Также чем-то похоже на groupby?

2. Является ли поведение поиска, возвращающего пустую последовательность для отсутствующей ключевой части стандартного контракта ILookup<,> или это реализация, которую можно свободно использовать KeyNotFoundException . Реализация в Rx выдает KeyNotFoundException .

3. На случай, если это кому-нибудь поможет: Dictionary<TKey, IEnumerable<TValue>> может быть описано как словарь списков. Это ToLookup() все равно что сказать: дайте мне словарь списков. По какой-то причине, услышав это описание таким образом, я смог разобраться в этом у себя в голове.

Ответ №2:

ToDictionary — это <TKey, TValue>, в то время как ToLookup<TKey, T1, T2, T3, …> похож на IGrouping, но перечисление остается в памяти.

Комментарии:

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