Meine Frage betrifft die Aufzählung von Wörterbuchelementen
// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();
// add values using add
_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");
// add values using []
_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;
// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}
In welcher Reihenfolge werden die Elemente aufgelistet? Kann ich die alphabetische Reihenfolge erzwingen?
c#
.net
dictionary
ienumerable
Captain Comic
quelle
quelle
Antworten:
Die Reihenfolge der Elemente in einem Wörterbuch ist nicht deterministisch. Der Ordnungsbegriff ist für Hashtabellen einfach nicht definiert. Verlassen Sie sich also nicht auf die Aufzählung in derselben Reihenfolge, in der Elemente zum Wörterbuch hinzugefügt wurden. Das ist nicht garantiert.
Zitat aus dem Dokument :
quelle
Wenn Sie möchten, dass die Elemente geordnet werden, verwenden Sie ein OrderedDictionary . Ein gewöhnliches hastable / Wörterbuch wird nur in gewissem Sinne des Speicherlayouts bestellt.
quelle
Sie können immer dafür verwenden
SortedDictionary
. Beachten Sie, dass das Wörterbuch standardmäßig nach Schlüssel sortiert ist, sofern kein Vergleicher angegeben wurde.Ich bin skeptisch in Bezug auf die Verwendung
OrderedDictionary
für das, was Sie wollen, da die Dokumentation Folgendes besagt:quelle
SortedDictionary<K,V>
es als binärer Suchbaum implementiert ist, der seinen Operationen eine andere zeitliche und räumliche Komplexität verleiht als der auf Hashtabellen basierendenDictionary<K,V>
. Wenn Benutzer eineO(1)
Hashtabellenstruktur zum Einfügen / Löschen benötigen und auch Elemente in Schlüsselreihenfolge durchlaufen möchten, sollten siedict.Keys.OrderBy( k => k ).Select( k => dict[k] )
stattdessen (auf Kosten vonO(n)
Platz undO( n log n )
Zeit) für dieOrderBy()
(die die gesamte Schlüsselsammlung in einer internen Liste puffern muss) vorgehen ).Die Elemente werden in der Reihenfolge zurückgegeben, in der sie physisch im Wörterbuch gespeichert sind. Dies hängt vom Hash-Code und der Reihenfolge ab, in der die Elemente hinzugefügt wurden. Daher erscheint die Reihenfolge zufällig, und wenn sich die Implementierungen ändern, sollten Sie sich niemals darauf verlassen, dass die Reihenfolge gleich bleibt.
Sie können die Artikel bestellen, wenn Sie sie auflisten:
In Framework 2.0 müssten Sie zuerst die Elemente in eine Liste aufnehmen, um sie zu sortieren:
quelle
Für ein bestelltes Wörterbuch:
Artikel werden in der Reihenfolge zurückgegeben, in der sie hinzugefügt wurden.
quelle
Assoziative Arrays (auch bekannt als Hash-Tabellen) sind ungeordnet, was bedeutet, dass die Elemente auf jede erdenkliche Weise geordnet werden können.
Sie können jedoch die Array-Schlüssel (nur die Schlüssel) abrufen, diese alphabetisch (über eine Sortierfunktion) sortieren und dann daran arbeiten.
Ich kann Ihnen kein C # -Beispiel geben, da ich die Sprache nicht kenne, aber dies sollte ausreichen, damit Sie selbst weitermachen können.
quelle