Wenn SortedDictionary aufgelistet wird, gibt es KeyValuePairs in der erwarteten Reihenfolge zurück?

8

Wenn ich SortedDictionary<TK, TV> in .NET habe und es als ICollection<KeyValuePair<TK, TV>> aufzählen möchte, zählt es in der erwarteten Reihenfolge auf?

Das ist KeyValuePair<TK, TV> mit dem niedrigsten Schlüssel wird als erstes zurückgegeben, gefolgt von KeyValuePair<TK, TV> mit dem zweitniedrigsten Schlüssel usw.?

Hinweis: Es wird nur die antwortbasierte Antwort akzeptiert.

    
drasto 23.04.2011, 15:58
quelle

3 Antworten

3

Ja, definitiv, obwohl Sie es sehr schwer finden werden, eine Dokumentation zu finden, die genau diese präzisiert .

Obwohl die Dokumentation für jede der vier GetEnumerator Überladungen dieses Typs vage Aussagen über die Rückgabe eines "Aufzählers, der durch eine Sammlung iteriert" gibt, ist es offensichtlich, dass sie äquivalente (nach Schlüssel sortierte) Sequenzen erzeugen sollten; Denken Sie daran, dass ein sortiertes Wörterbuch "eine Sammlung von Schlüssel / Wert-Paaren darstellen soll, die nach dem Schlüssel sortiert sind". Es wäre hoch für Benutzer nicht intuitiv und verwirrend, wenn sich eine Auflistung beispielsweise zwischen einer foreach -Schleife und einer LINQ to Objects-Abfrage völlig anders (d. H. Mit einer anderen Aufzählungsreihenfolge) verhält.

Das Beste, was ich tun kann, ist, Sie mit den Implementierungen der beiden GetEnumerator -Methoden zu versorgen, an denen Sie interessiert zu sein scheinen (ab .NET 4.0). Sie sind identisch - sie geben eine Instanz des geschachtelten Enumerator -Typs mit den gleichen Argumenten für den Konstruktor zurück. Der einzige Unterschied ist das Boxen des Strukturtyps in der zweiten Überladung:

%Vor%

Tatsächlich ist die einzige GetEnumerator Überladung, die eine geringfügig andere Implementierung hat, die Methode IDictionary.GetEnumerator . Dadurch wird ein Argument für den Konstruktoraufruf so geändert, dass der resultierende Enumerator DictionaryEntry Instanzen statt KeyValuePair<,> Instanzen erzeugt. Natürlich ist die Aufzählungsreihenfolge immer noch die gleiche wie bei den anderen Überladungen.

    
Ani 23.04.2011, 16:18
quelle
10

Von der Referenz für GetEnumerator:

"Das Verzeichnis wird in einer sortierten Reihenfolge unter Verwendung eines internen Baums gepflegt. Jedes neue Element wird an der richtigen Sortierposition positioniert und der Baum wird angepasst, um die Sortierreihenfolge beizubehalten, wenn ein Element entfernt wird. Beim Aufzählen die Sortierreihenfolge ist gepflegt. "

Speziell: "Während der Aufzählung wird die Sortierreihenfolge beibehalten."

    
TofuBeer 23.04.2011 16:48
quelle
1

Es hängt von der Standardprozedur IComparer des Schlüssels ab, vorausgesetzt, Sie übergeben keinen Schlüssel:

  

SortedDictionary (Of TKey, TValue) benötigt eine Vergleichsimplementierung, um Schlüsselvergleiche durchzuführen. Sie können eine Implementierung der generischen Schnittstelle IComparer (Of T) angeben, indem Sie einen Konstruktor verwenden, der einen Vergleichsparameter akzeptiert. Wenn Sie keine Implementierung angeben, wird der standardmäßige generische Comparer Comparer (Of T) .Default verwendet. Wenn der Typ TKey die generische Schnittstelle System.IComparable (Of T) implementiert, verwendet der Standardvergleicher diese Implementierung.

Sehen Sie sich den Abschnitt Remarks der Seite SortedDictionary<TKey, TValue> an.

Wenn also Ihr Schlüssel ein string ist, wird die String-Implementierung von IComparable verwendet, wenn eine int32 die int32 Implementierung verwendet wird.

    
Oded 23.04.2011 16:01
quelle