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.
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:
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.
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."
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.
Tags und Links .net c# ienumerable sorteddictionary idictionary