Geschichte der Frage:
Sammlungen vom Typ SortedList und SortedDictionary wurden in .NET eingeführt, um Schlüssel-Wert-Paare in einer nach Schlüssel sortierten Form bequem zu speichern. Sie werden verwendet, wenn der schnelle Zugriff auf den Schlüssel bei gleichzeitiger Unterstützung der Sortierung wichtig ist.
Problem:
Häufige Fehler sind der falsche Umgang mit der Auswahl zwischen diesen Sammlungen, die Verwendung von Schlüsseln eines ungeeigneten Typs (ohne Unterstützung für IComparable) sowie falsche Erwartungen an das Verhalten beim Einfügen von doppelten Schlüsseln.
Lösung:
In Visual Basic werden die Klassen SortedList(Of TKey, TValue) und SortedDictionary(Of TKey, TValue) zum Speichern sortierter Daten verwendet.
Beispielcode:
Dim sortedList As New SortedList(Of String, Integer)() sortedList.Add("Alex", 27) sortedList.Add("Mike", 34) Dim age As Integer = sortedList("Alex") ' 27 Dim sortedDict As New SortedDictionary(Of Integer, String)() sortedDict.Add(3, "Drei") sortedDict.Add(1, "Eins") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next
Wesentliche Merkmale:
1. Kann man die Schlüssel bestehender Elemente in SortedList oder SortedDictionary ändern?
Nein, der Schlüssel eines bestehenden Elements kann nicht geändert werden. Um den Schlüssel zu "ändern", muss das ursprüngliche Paar gelöscht und ein neues mit dem korrigierten Schlüssel hinzugefügt werden.
2. Welche Ausnahme tritt auf, wenn man versucht, einen bereits vorhandenen Schlüssel hinzuzufügen?
Es wird eine ArgumentException ausgelöst.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "Eins") sl.Add(1, "Wiederholung") ' ArgumentException
3. Was passiert, wenn in den Schlüsseln ein Typ verwendet wird, der IComparable nicht implementiert?
Der Compiler erlaubt es, die Sammlung zu erstellen, aber beim Versuch, das erste Element hinzuzufügen, wird eine InvalidOperationException ausgelöst.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Ausnahme
Ein Benutzerregister wurde basierend auf der Benutzer-ID (userId – Schlüssel) und dem Alter (Wert) in SortedList implementiert. Der Schlüssel war ein eigener Objekttyp (User), der IComparable nicht implementiert. Beim Hinzufügen von Benutzern treten unerwartete Ausnahmen auf.
Vorteile:
Nachteile:
Verwendet wird SortedDictionary(Of Integer, User), wobei der Schlüssel ein einfacher Typ Integer (userId) ist, der Vergleiche unterstützt. Alles funktioniert korrekt, es gibt eine Sortierung nach Benutzer-IDs.
Vorteile:
Nachteile: