wake-up-neo.com

Die Reihenfolge der Elemente im Wörterbuch

Meine Frage bezieht sich auf die Aufzählung von Dictionary-Elementen

// 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?

94
Captain Comic

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 der Reihenfolge, in der Elemente zum Wörterbuch hinzugefügt wurden. Das ist nicht garantiert.

Zitat aus dem Dokument :

Zum Zwecke der Aufzählung wird jedes Element im Wörterbuch als KeyValuePair<TKey, TValue> Struktur, die einen Wert und seinen Schlüssel darstellt. Die Reihenfolge, in der die Artikel zurückgegeben werden, ist undefiniert.

112
Darin Dimitrov

Sie können dafür immer SortedDictionary verwenden. Beachten Sie, dass das Wörterbuch standardmäßig nach Schlüssel sortiert ist, sofern kein Vergleich angegeben wurde.

Ich bin skeptisch in Bezug auf die Verwendung von OrderedDictionary für das, was Sie wollen, da die Dokumentation Folgendes besagt:

Die Elemente eines OrderedDictionary werden im Gegensatz zu den Elementen einer SortedDictionary-Klasse nicht nach dem Schlüssel sortiert.

24
Adrian Carneiro

Wenn Sie die Elemente sortieren möchten, verwenden Sie ein OrderedDictionary . Eine gewöhnliche hastable/Wörterbuch ist nur in gewissem Sinne des Speicherlayouts bestellt.

23
Mitch Wheat

Die Elemente werden in der Reihenfolge zurückgegeben, in der sie tatsächlich im Wörterbuch gespeichert sind. Dies hängt vom Hash-Code und der Reihenfolge ab, in der die Elemente hinzugefügt wurden. Die Reihenfolge scheint also zufällig zu sein, und da sich die Implementierungen ändern, sollten Sie sich niemals darauf verlassen, dass die Reihenfolge gleich bleibt.

Sie können die Artikel bei der Aufzählung bestellen:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) {
  ...
}

In Framework 2.0 müssten Sie zuerst die Elemente in eine Liste einfügen, um sie zu sortieren:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary);
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); });
foreach (KeyValuePair<string,string> kvp in items) {
  ...
}
12
Guffa

Für ein OrderedDictionary:

 var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary();

_OrderedDictionary.Add("testKey1", "testValue1");
_OrderedDictionary.Add("testKey2", "testValue2");
_OrderedDictionary.Add("testKey3", "testValue3");

var k = _OrderedDictionary.Keys.GetEnumerator();
var v = _OrderedDictionary.Values.GetEnumerator();

while (k.MoveNext() && v.MoveNext()) {
    var key = k.Current; var value = v.Current;
}

Artikel werden in der Reihenfolge zurückgegeben, in der sie hinzugefügt wurden.

11
Barton

Assoziative Arrays (auch bekannt als Hash-Tabellen) sind ungeordnet, was bedeutet, dass die Elemente auf jede erdenkliche Weise sortiert werden können.

Sie können jedoch die Array-Schlüssel (nur die Schlüssel) abrufen, alphabetisch sortieren (über eine Sortierfunktion) und dann daran arbeiten.

Ich kann Ihnen kein C # -Beispiel geben, da ich die Sprache nicht kenne, aber dies sollte ausreichen, damit Sie sich weiterentwickeln können.

4
Tim Čas