Wenn eine Ausnahme keine Option ist, wählen Sie Nachschlagen
Wenn Sie versuchen, eine so effiziente Struktur wie eine zu erhalten, Dictionaryaber nicht sicher sind, dass die Eingabe keinen doppelten Schlüssel enthält, Lookupist dies sicherer.
Wie in einer anderen Antwort erwähnt, unterstützt es auch Nullschlüssel und gibt immer ein gültiges Ergebnis zurück, wenn es mit beliebigen Daten abgefragt wird, sodass es für unbekannte Eingaben widerstandsfähiger erscheint (weniger anfällig als Dictionary, Ausnahmen auszulösen).
Und es ist besonders wahr, wenn Sie es mit der System.Linq.Enumerable.ToDictionaryFunktion vergleichen:
// 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);
Die Alternative wäre, Ihren eigenen doppelten Schlüsselverwaltungscode in eine foreachSchleife zu schreiben .
Leistungsüberlegungen, Wörterbuch: ein klarer Gewinner
Wenn Sie keine Liste benötigen und eine große Anzahl von Elementen verwalten Dictionarymöchten (oder sogar Ihre eigene maßgeschneiderte Struktur), ist dies effizienter:
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);
// ...
Da Lookupfür jeden Schlüssel eine Liste mit Elementen geführt werden muss, ist diese langsamer als das Wörterbuch (etwa dreimal langsamer für eine große Anzahl von Elementen).
Suchgeschwindigkeit: Erstellung: 00: 00: 01.5760444
Wörterbuchgeschwindigkeit: Erstellung: 00: 00: 00.4418833