В чем разница между LINQ ToDictionary и ToLookup? Кажется, они делают то же самое.
В чем разница между LINQ ToDictionary и ToLookup? Кажется, они делают то же самое.
Ответы:
Словарь представляет собой карту 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