В чем разница между LINQ ToDictionary и ToLookup? Кажется, они делают то же самое.
123
Словарь представляет собой карту 1: 1 (каждый ключ отображается на одно значение), а словарь является изменяемым (редактируемым) постфактум.
Поиск - это карта 1: многие (мульти-карта; каждый ключ сопоставляется с одним IEnumerable<>
из значений с этим ключом), и в ILookup<,>
интерфейсе нет изменений.
В качестве побочного примечания вы можете запросить поиск (через индексатор) по несуществующему ключу, и вы получите пустую последовательность. Сделайте то же самое со словарем, и вы получите исключение.
Итак: сколько записей разделяет каждый ключ?
Чрезмерно упрощенный способ смотреть на него в том , что Lookup<TKey,TValue>
это примерно сопоставимы с аDictionary<TKey,IEnumerable<TValue>>
ILookup<,>
или реализация, которая может генерировать файлKeyNotFoundException
. Реализация в Rx бросаетKeyNotFoundException
.Dictionary<TKey, IEnumerable<TValue>>
можно описать как словарь списков. ТакToLookup()
, как говорят: дайте мне словарь списков. По какой-то причине, когда я услышал об этом так, это помогло мне прочувствовать это в моей голове.ToDictionary - это <TKey, TValue>, а ToLookup <TKey, T1, T2, T3, ...> аналогичен IGrouping, но перечисление остается в памяти.
источник
T1, T2, T3, ...
; ToLookup и ToDictionary (сами методы) имеют примерно одинаковый API