Geschiedenis van de vraag:
Verzamelingen zoals SortedList en SortedDictionary zijn geïntroduceerd in .NET voor het gemakkelijke opslaan van sleutel-waarde paren in een gesorteerde volgorde op basis van de sleutel. Ze worden gebruikt wanneer snelle toegang op sleutel belangrijk is, terwijl ook sortering wordt ondersteund.
Probleem:
Veelvoorkomende fouten hebben te maken met de verkeerde keuze tussen deze verzamelingen, het gebruik van sleutels van een ongepast type (zonder ondersteuning voor IComparable), en ook met onrealistische verwachtingen over het gedrag bij het invoegen van dubbele sleutels.
Oplossing:
In Visual Basic worden de klassen SortedList(Of TKey, TValue) en SortedDictionary(Of TKey, TValue) gebruikt voor het opslaan van gesorteerde gegevens.
Voorbeeldcode:
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, "Drie") sortedDict.Add(1, "Een") For Each pair In sortedDict Console.WriteLine(pair.Key & ": " & pair.Value) Next
Belangrijke kenmerken:
1. Is het mogelijk om sleutels van bestaande elementen in SortedList of SortedDictionary te wijzigen?
Nee, het is niet mogelijk om de sleutel van een bestaand element te wijzigen. Om een sleutel "te veranderen", moet de oorspronkelijke par worden verwijderd en een nieuwe worden toegevoegd met de gecorrigeerde sleutel.
2. Welke uitzondering wordt opgegooid bij de poging om een reeds bestaande sleutel toe te voegen?
Er wordt een ArgumentException opgegooid.
Dim sl As New SortedList(Of Integer, String)() sl.Add(1, "Een") sl.Add(1, "Herhaling") ' ArgumentException
3. Wat gebeurt er als je een type gebruikt in de sleutels dat IComparable niet implementeert?
De compiler staat toe om de verzameling te maken, maar bij de poging om het eerste element toe te voegen, zal een InvalidOperationException worden opgegooid.
Class MyObj End Class Dim sd As New SortedDictionary(Of MyObj, String)() sd.Add(New MyObj(), "test") ' Exceptie
Er werd een gebruikersregister geïmplementeerd op basis van een ID (userId — sleutel) en leeftijd (waarde) met SortedList. De sleutel was een eigen objecttype (User), dat geen IComparable implementeert. Bij het toevoegen van gebruikers treden onverwachte uitzonderingen op.
Voordelen:
Nadelen:
Gebruik maken van SortedDictionary(Of Integer, User), waarbij de sleutel een eenvoudig type Integer (userId) is dat vergelijking ondersteunt. Alles werkt correct, er is sortering op gebruikers-ID.
Voordelen:
Nadelen: