Also bin ich Dictionary<int, int>
heute auf der Arbeit gestoßen. Das kam mir einfach komisch vor, weil ich wahrscheinlich List<int>
stattdessen einfach eine verwendet hätte. Gibt es einen Unterschied und würde es einen Anwendungsfall geben, bei dem eine Struktur der anderen vorgezogen würde?
c#
.net
data-structures
ZeroDivide
quelle
quelle
List<T>
innerhalb von .NET Framework ist ein Array mit wahlfreiem Zugriff, bei dem ein Suchvorgang normalerweise schneller ist als bei aDictionary<int,T>
.Dictionary<TKey, TValue>
.Antworten:
Sie würden a verwenden,
Dictionary<int, int>
wenn Ihre Indizes neben der Positionsplatzierung eine besondere Bedeutung haben.Das unmittelbare Beispiel, das mir in den Sinn kommt, ist das Speichern einer ID-Spalte und einer Int-Spalte in einer Datenbank. Wenn Sie zum Beispiel eine
[person-id]
Spalte und eine[personal-pin]
Spalte haben, können Sie diese in a bringenDictionary<int, int>
. Auf diese Weise erhaltenpinDict[person-id]
Sie eine PIN, aber der Index ist aussagekräftig und nicht nur eine Position in aList<int>
.Aber wenn Sie zwei zusammengehörige Listen mit ganzen Zahlen haben, könnte dies eine geeignete Datenstruktur sein.
quelle
List<int>
und kein Wörterbuch auswählen . Siehe meine Antwort unten.Stellen Sie sich das
List
als Array und dasDictionary
als Hash-Tabelle vor . Sie würden nur dann verwenden,Dictionary
wenn Sie aussagekräftige Schlüssel zu Werten zuordnenList
(oder zuordnen) müssten , wohingegen nur Positionen (oder Indizes) zu Werten zugeordnet werden.Angenommen, Sie möchten eine Zuordnung zwischen dem Alter und der Körpergröße einer Person speichern. Sie können a verwenden
Dictionary<int, int>
, um das Alter (anint
) der Person auf ihre Größe (anint
) abzubilden :Kein sehr nützliches Beispiel, aber der Punkt ist, dass Sie dies nicht so elegant mit einem tun können,
List
weil es diese Werte positionell speichern müsste.quelle
List
mit Angebote um , wo eineDictionary
befasst sich mit Verband . Wenn Sie Ihre Daten jedes Mal in einer bestimmten Reihenfolge abrufen müssen oder die Reihenfolge in Bezug aufeinander wichtig ist,List
ist a der richtige Weg.Dictionaries
neigen dazu, ungeordnet zu sein, und beschäftigen sich mit Mapping-Schlüssel -> Wert-Beziehungen.Semantisch sind a
Dictionary<int, T>
undList<T>
sehr ähnlich, beide sind Container mit wahlfreiem Zugriff des .NET-Frameworks. Um eine Liste als Ersatz für ein Wörterbuch zu verwenden, benötigen Sie einen speziellen Wert in Ihrem TypT
(wienull
), um die leeren Slots in Ihrer Liste darzustellen. WennT
es sich nicht um einen nullwertfähigen Typ handeltint
, können Sieint?
stattdessen einen verwenden. Wenn Sie nur positive Werte speichern möchten, können Sie auch einen speziellen Wert wie -1 verwenden, um leere Slots darzustellen.Welches Sie auswählen, hängt vom Bereich der Schlüsselwerte ab. Wenn sich Ihre Schlüssel in
Dictionary<int, T>
in einem ganzzahligen Intervall ohne große Lücken zwischen ihnen befinden (z. B. 80 Werte von [0, ... 100]), ist aList<T>
geeigneter, da der Zugriff per Index schneller ist, und In diesem Fall ist der Speicher- und Zeitaufwand im Vergleich zu einem Wörterbuch geringer.Wenn Ihre Schlüsselwerte 100
int
Werte aus einem Bereich wie [0, ..., 1000000] sind,List<T>
benötigt a Speicher für 1000000 Werte von T, wobei Ihr Wörterbuch nur Speicher in einer Größenordnung von etwa 100 Werten von T benötigt. 100 Werte von int (plus etwas Overhead, in Wirklichkeit wird etwa das Zweifache des Speichers zum Speichern dieser 100 Schlüssel und Werte erwartet). Im letzteren Fall ist ein Wörterbuch besser geeignet.quelle
List<KeyValuePair<int,T>>
dass keine O (1) -Nachschlagoperation verfügbar ist. Zweitens können Elemente inList<KeyValuePair<int,T>>
einer bestimmten Reihenfolge angeordnet sein, unabhängig von ihren Schlüsselwerten. Wenn Sie Letzteres brauchen, aber nicht Ersteres,List<KeyValuePair<int,T>>
oderList<Tuple<int,T>>
die bessere Wahl sein könnten. Wenn Sie beides brauchen, gibt es auchOrderedDictionary
.Wie kann man sie als gleichwertig betrachten?
Das Wörterbuch ist spärlich und erlaubt zufällige Einfügungen, macht aber das Durchlaufen in der Reihenfolge zu einem Problem. Die Liste ist nicht spärlich und das Einfügen in der falschen Reihenfolge ist teuer. Sie bietet von Natur aus das Durchlaufen in der Reihenfolge.
Es würde sehr wenige Situationen geben, in denen einer dem anderen nicht dramatisch überlegen war.
quelle
Nebenbei: Andere Programmiersprachen bezeichnen diese Art von Datenstruktur als Map und nicht als Dictionary.
Wenn Ihre Daten sinnvoll als Schlüssel / Wert-Paare definiert werden können, bietet ein Wörterbuch einen viel schnelleren Zugriff, wenn Sie einen Wert anhand seines Schlüssels suchen müssen.
Angenommen, Sie haben eine Liste mit Kunden. Jeder Kunde enthält Details wie Name und Adresse sowie eine eindeutige Kundennummer. Angenommen, Sie haben auch eine Liste der Bestellungen, die gerade bearbeitet werden. Jede Bestellung enthält Details zu den Vorgängen und muss die Kundennummer der Person enthalten, die sie bestellt hat.
Wenn eine Bestellung versandbereit ist, müssen Sie die Adresse finden, an die sie gesendet werden soll. Wenn die Kunden als einfache Liste gespeichert sind, müssen Sie die gesamte Liste durchsuchen, um den Kunden mit der richtigen Kundennummer zu finden. Stattdessen können Sie die Kunden in einem Wörterbuch mit der Kundennummer als Schlüssel speichern. Mit dem Wörterbuch können Sie nun in einem Schritt den richtigen Kunden ermitteln, ohne dass eine Suche erforderlich ist.
quelle
Das Dictionary verwendet Hashing, um nach Daten zu suchen. Ein Dictionary berechnete zuerst einen Hash-Wert für den Schlüssel und dieser Hash-Wert führt zum Zieldaten-Bucket. Danach muss jedes Element im Bucket auf Gleichheit überprüft werden. Tatsächlich ist die Liste jedoch schneller als das Wörterbuch bei der Suche nach dem ersten Element, da im ersten Schritt nichts gesucht werden muss. Im zweiten Schritt muss die Liste jedoch erst das erste Element und dann das zweite Element durchsehen. Daher nimmt die Suche von Schritt zu Schritt mehr Zeit in Anspruch. Je größer die Liste, desto länger dauert es.
Mehr über ... Dictionary Vs List mit Beispiel.
quelle
Wenn der betreffende Code zwei Sätze von korrelierten Werten speichert, bietet die Dictionary-Klasse eine indizierte Methode zum Nachschlagen von Werten mit einem Schlüssel. Wenn es nur einen Satz von Werten gibt, auf diesen Satz jedoch nach dem Zufallsprinzip zugegriffen werden muss (um möglicherweise zu überprüfen, ob ein Schlüssel in einem Satz vorhanden ist) und die Werte eindeutig sind, ist ein HashSet möglicherweise die beste zu verwendende Satzklasse.
quelle
Dies sind großartige Antworten, die die Grundlagen zu decken scheinen.
Eine weitere Überlegung, die ich anbieten werde, ist, dass Wörterbücher (in C #) aus Codierungssicht komplexer sind. Wenn sich Listen und Wörterbücher in derselben Codebasis befinden, ist die Pflege des Codes schwieriger, da beide Methoden geringfügige Unterschiede in der Ausführung grundlegender Vorgänge wie Suchen und Sammeln von Objektdaten aufweisen. Ich gehe davon aus, dass Sie eine Liste verwenden sollten, es sei denn, Sie benötigen aus einem berechtigten Grund ein Wörterbuch.
quelle