#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