Jeśli wyjątek nie jest opcją, przejdź do Lookup
Jeśli próbujesz uzyskać strukturę tak wydajną jak a, Dictionary
ale nie wiesz na pewno, że nie ma zduplikowanego klucza w danych wejściowych, Lookup
jest bezpieczniejsze.
Jak wspomniano w innej odpowiedzi, obsługuje również klucze o wartości null i zwraca zawsze prawidłowy wynik podczas odpytywania z dowolnymi danymi, więc wydaje się być bardziej odporny na nieznane dane wejściowe (mniej podatny niż słownik na zgłaszanie wyjątków).
A jest to szczególnie prawdziwe, jeśli porównasz to z System.Linq.Enumerable.ToDictionary
funkcją:
// 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);
Alternatywą byłoby napisanie własnego zduplikowanego kodu zarządzania kluczami wewnątrz foreach
pętli.
Uwagi dotyczące wydajności, słownik: wyraźny zwycięzca
Jeśli nie potrzebujesz listy i zamierzasz zarządzać ogromną liczbą elementów Dictionary
(lub nawet własną niestandardową strukturą), byłoby bardziej wydajne:
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);
// ...
Ponieważ Lookup
musi utrzymywać listę elementów dla każdego klucza, jest wolniejszy niż słownik (około 3x wolniejszy w przypadku dużej liczby elementów)
Szybkość wyszukiwania: tworzenie: 00: 00: 01.5760444
Prędkość słownika: tworzenie: 00: 00: 00.4418833