Когда исключение не является опцией, перейти к поиску
Если вы пытаетесь получить структуру, столь же эффективную, как, Dictionary
но не знаете наверняка, что во вводе нет повторяющегося ключа, Lookup
это безопаснее.
Как уже упоминалось в другом ответе, он также поддерживает нулевые ключи и всегда возвращает действительный результат при запросе к произвольным данным, поэтому он выглядит более устойчивым к неизвестному вводу (менее склонен, чем словарь, вызывать исключения).
И это особенно верно, если вы сравните это с System.Linq.Enumerable.ToDictionary
функцией:
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
Альтернативой может быть написание собственного дублирующего кода управления ключами внутри foreach
цикла.
Производительность, словарь: явный победитель
Если вам не нужен список, и вы собираетесь управлять огромным количеством элементов Dictionary
(или даже собственной настраиваемой структурой), это будет более эффективным:
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
Так как Lookup
приходится вести список элементов для каждого ключа, он медленнее словаря (примерно в 3 раза медленнее для огромного количества элементов)
Скорость поиска: Создание: 00: 00: 01.5760444
Скорость словаря: Создание: 00: 00: 00.4418833