Jeśli wyjątek nie jest opcją, przejdź do Lookup
Jeśli próbujesz uzyskać strukturę tak wydajną jak a, Dictionaryale nie wiesz na pewno, że nie ma zduplikowanego klucza w danych wejściowych, Lookupjest 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.ToDictionaryfunkcją:
// 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 foreachpę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ż Lookupmusi 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