it-swarm.com.de

Wörterbuch gegen Liste

Also bin ich heute bei der Arbeit auf einen Dictionary<int, int> Gestoßen. Das kam mir einfach komisch vor, weil ich stattdessen wahrscheinlich nur einen List<int> Verwendet hätte. Gibt es einen Unterschied und würde es einen Anwendungsfall geben, bei dem eine Struktur der anderen vorgezogen würde?

30
ZeroDivide

Sie würden einen Dictionary<int, int> Verwenden, wenn Ihre Indizes neben der Positionsplatzierung eine besondere Bedeutung haben.

Das unmittelbare Beispiel ist das Speichern einer ID-Spalte und einer Int-Spalte in einer Datenbank. Wenn Sie beispielsweise eine Spalte [person-id] Und eine Spalte [personal-pin] Haben, können Sie diese in eine Spalte Dictionary<int, int> Einfügen. Auf diese Weise erhalten Sie mit pinDict[person-id] Eine PIN, aber der Index ist aussagekräftig und nicht nur eine Position in einem List<int>.

Aber wirklich, jedes Mal, wenn Sie zwei verwandte Listen von ganzen Zahlen haben, könnte dies eine geeignete Datenstruktur sein.

33
Kris Harper

Stellen Sie sich das List als Array und das Dictionary als Hash-Tabelle vor. Sie würden das Dictionary nur verwenden, wenn Sie aussagekräftige Schlüssel zu Werten zuordnen (oder zuordnen) müssten, während ein List nur Positionen (oder Indizes) Werten zuordnet (oder zuordnet).

Angenommen, Sie möchten eine Zuordnung zwischen dem Alter einer Person und ihrer Größe speichern. Sie können einen Dictionary<int, int> Verwenden, um das Alter der Person (ein int) ihrer Größe (ein int) zuzuordnen:

Dictionary<int, int> personHeightMap = new Dictionary<int, int>();

personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);

int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;

Kein sehr nützliches Beispiel, aber der Punkt ist, dass Sie dies mit einem List nicht so elegant tun könnten, da diese Werte positionell gespeichert werden müssten.

28
Bernard

Semantisch sind sich Dictionary<int, T> Und List<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 Typ T (wie null), um die leeren Slots in Ihrer Liste darzustellen. Wenn T kein nullfähiger Typ wie int ist, können Sie stattdessen int? Verwenden, oder wenn Sie nur erwarten, positive Werte zu speichern, können Sie auch einen speziellen Wert wie verwenden -1, um leere Slots darzustellen.

Welche Sie auswählen, sollte vom Bereich der Schlüsselwerte abhängen. Wenn sich Ihre Schlüssel im Dictionary<int, T> Innerhalb eines ganzzahligen Intervalls befinden, ohne dass viele Lücken zwischen ihnen bestehen (z. B. 80 Werte von [0, ... 100]), wird ein List<T> Angegeben geeigneter, da der Zugriff per Index schneller ist und in diesem Fall weniger Speicher- und Zeitaufwand im Vergleich zu einem Wörterbuch anfällt.

Wenn Ihre Schlüsselwerte 100 int Werte aus einem Bereich wie [0, ..., 1000000] sind, benötigt ein List<T> Speicher, um 1000000 Werte von T aufzunehmen, wo Ihr Wörterbuch nur benötigt Speicher in einer Größenordnung um 100 Werte von T, 100 Werte von int (plus etwas Overhead, in Wirklichkeit erwarten Sie ungefähr das Zweifache des Speichers zum Speichern dieser 100 Schlüssel und Werte). Im letzteren Fall ist ein Wörterbuch besser geeignet.

15
Doc Brown

Wie kann jemand sie als gleichwertig betrachten?

Das Wörterbuch ist spärlich und erlaubt zufällige Einfügungen, macht jedoch das Durchlaufen in der Reihenfolge zu einem Problem. Die Liste ist nicht spärlich und das Einfügen außerhalb der Reihenfolge ist teuer. Es 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.

6
Loren Pechtel

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 mithilfe seines Schlüssels suchen müssen.

Angenommen, Sie haben eine Kundenliste. Jeder Kunde enthält Details wie einen Namen und eine Adresse sowie eine eindeutige Kundennummer. Angenommen, Sie haben auch eine Liste der Bestellungen, die verarbeitet werden. Jede Bestellung enthält Details zu den getätigten Bestellungen 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 versendet 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 speichern, wobei die Kundennummer der Schlüssel ist. Mit dem Wörterbuch können Sie jetzt in einem Schritt den richtigen Kunden finden, ohne suchen zu müssen.

2
Simon B

Das Wörterbuch verwendet Hashing, um nach den Daten zu suchen. Ein Wörterbuch berechnete zuerst einen Hashwert für den Schlüssel und dieser Hashwert 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 ersten Elementen, da im ersten Schritt nichts zu suchen ist. Im zweiten Schritt muss die Liste jedoch das erste Element und dann das zweite Element durchsehen. Daher dauert die Suche mit jedem Schritt mehr und mehr Zeit. Je größer die Liste, desto länger dauert es.

Mehr über .... Dictionary Vs List mit Beispiel.

1
Walshregal