Якщо виняток не є варіантом, перейдіть на пошук
Якщо ви намагаєтеся отримати структуру настільки ж ефективною, 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