Ich versuche mich darum zu kümmern, welche Datenstrukturen am effizientesten sind und wann / wo welche verwendet werden sollen.
Nun könnte es sein, dass ich die Strukturen einfach nicht gut genug verstehe, aber wie unterscheidet sich eine ILookup(of key, ...)
von einer Dictionary(of key, list(of ...))
?
Auch wo würde ich ein verwenden wollen ILookup
und wo wäre es effizienter in Bezug auf Programmgeschwindigkeit / Speicher / Datenzugriff usw.?
Antworten:
Zwei signifikante Unterschiede:
Lookup
ist unveränderlich. Yay :) (Zumindest glaube ich, dass die konkreteLookup
Klasse unveränderlich ist und dieILookup
Schnittstelle keine mutierenden Mitglieder bereitstellt. Es könnte natürlich auch andere veränderbare Implementierungen geben.)KeyNotFoundException
. (Daher gibt es keineTryGetValue
, AFAICR.)Ihre Effizienz ist wahrscheinlich gleichwertig - bei der Suche kann beispielsweise ein Blick
Dictionary<TKey, GroupingImplementation<TValue>>
hinter die Kulissen verwendet werden. Wählen Sie je nach Ihren Anforderungen zwischen ihnen. Persönlich finde ich, dass die Suche normalerweise besser passt als aDictionary<TKey, List<TValue>>
, hauptsächlich aufgrund der ersten beiden Punkte oben.Beachten Sie, dass als Implementierungsdetail, dessen konkrete Implementierung
IGrouping<,>
für die Werte implementiert wirdIList<TValue>
, implementiert wird , was bedeutet, dass die Verwendung mit usw. effizientCount()
istElementAt()
.quelle
Interessant, dass niemand den tatsächlich größten Unterschied angegeben hat (direkt aus MSDN entnommen ):
quelle
Sowohl a
Dictionary<Key, List<Value>>
als auch a könnenLookup<Key, Value>
logischerweise Daten enthalten, die auf ähnliche Weise organisiert sind, und beide haben dieselbe Effizienzreihenfolge. Der Hauptunterschied ist, dass aLookup
unveränderlich ist: Es gibt keineAdd()
Methoden und keinen öffentlichen Konstruktor (und wie Jon erwähnt hat, können Sie einen nicht vorhandenen Schlüssel ohne Ausnahme abfragen und den Schlüssel als Teil der Gruppierung haben).Welche Sie verwenden, hängt wirklich davon ab, wie Sie sie verwenden möchten. Wenn Sie eine Zuordnung von Schlüsseln zu mehreren Werten pflegen, die ständig geändert wird,
Dictionary<Key, List<Value>>
ist a wahrscheinlich besser, da es veränderbar ist.Wenn Sie jedoch eine Datenfolge haben und nur eine schreibgeschützte Ansicht der nach Schlüssel geordneten Daten wünschen, ist eine Suche sehr einfach zu erstellen und liefert einen schreibgeschützten Schnappschuss.
quelle
Der Hauptunterschied zwischen an
ILookup<K,V>
und aDictionary<K, List<V>>
besteht darin, dass ein Wörterbuch veränderlich ist. Sie können Schlüssel hinzufügen oder entfernen sowie Elemente zur nachgeschlagenen Liste hinzufügen oder daraus entfernen. EinILookup
ist unveränderlich und kann nach seiner Erstellung nicht mehr geändert werden.Die zugrunde liegende Implementierung beider Mechanismen ist entweder gleich oder ähnlich, sodass ihre Suchgeschwindigkeit und ihr Speicherbedarf ungefähr gleich sind.
quelle
Ein weiterer Unterschied, der noch nicht erwähnt wurde, ist, dass Lookup () Nullschlüssel unterstützt :
quelle
Wenn eine Ausnahme keine Option ist, wählen Sie Nachschlagen
Wenn Sie versuchen, eine so effiziente Struktur wie eine zu erhalten,
Dictionary
aber nicht sicher sind, dass die Eingabe keinen doppelten Schlüssel enthält,Lookup
ist 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.ToDictionary
Funktion vergleichen:Die Alternative wäre, Ihren eigenen doppelten Schlüsselverwaltungscode in eine
foreach
Schleife zu schreiben .Leistungsüberlegungen, Wörterbuch: ein klarer Gewinner
Wenn Sie keine Liste benötigen und eine große Anzahl von Elementen verwalten
Dictionary
möchten (oder sogar Ihre eigene maßgeschneiderte Struktur), ist dies effizienter:Da
Lookup
fü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).quelle