Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

22.18. System.Collections.SortedList

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

22.18.1. Dictionary en List Collectie

Een ander in de System.Collections namespace voorgedefinieerd dictionary type is SortedList.  Opnieuw zijn de elementen een combinatie van een sleutel (key) en waarde (value).

Aan de naam merk je meteen ook op dat het hier niet alleen gaat over een dictionary, maar ook over een list collectie.  Zo hebben de elementen in de collectie een bepaald volgorde, het is namelijk zo dat de items automatisch worden gesorteerd op hun key.  En men kan bijvoorbeeld een element op een bepaalde positie (index) aanspreken.

Elementen kunnen dus zowel via hun key als via hun positie worden aangesproken, dit maakt SortedList wat flexibeler dan Hashtable.
De sortering bij het plaatsen en verwijderen van elementen maakt echter het werken met een SortedList trager dan met een Hashtable.

In onderstaand voorbeeld worden enkele members uit het type SortedList gedemonstreerd.
Visual Basic 2012 Broncode - Codevoorbeeld 572
Class Example1
    Public Shared Sub Main()
        Dim sortedList1 As New System.Collections.SortedList
        '
        Console.WriteLine(sortedList1.Capacity)                    ' 0       (1)
        Console.WriteLine(sortedList1.Count)                       ' 0
        '
        sortedList1.Add("0123/456.789", "John Doe")
        sortedList1.Add("0234/567.890", "Jane Doe")
        '
        Console.WriteLine(sortedList1.Capacity)                    ' 16      (1)
        Console.WriteLine(sortedList1.Count)                       ' 2
        PrintSortedList(sortedList1)
        PrintSortedListKeys(sortedList1)
        PrintSortedListValues(sortedList1)
        '
        Console.WriteLine(sortedList1.GetKey(1))                ' "0234/567.890"
        Console.WriteLine(sortedList1.GetByIndex(1))            ' "Jane Doe"
        Console.WriteLine(sortedList1.Item("0123/456.789"))     ' "John Doe"
        sortedList1.Item("0123/456.789") = "Tom Doe"            '            (2)
        Console.WriteLine(sortedList1.Item("0123/456.789"))     ' "Tom Doe"
        '
        Console.WriteLine(sortedList1.IndexOfKey("0234/567.890"))  ' 1       (3)
        Console.WriteLine(sortedList1.IndexOfValue("Jane Doe"))    ' 1       (4)
        '
        sortedList1.TrimToSize()                                           ' (5)
        Console.WriteLine(sortedList1.Count)                       ' 2
        Console.WriteLine(sortedList1.Capacity)                    ' 2
        '
        Console.WriteLine(sortedList1.Contains("0234/567.890"))    ' True    (6)
        Console.WriteLine(sortedList1.ContainsKey("0234/567.890")) ' True    (6)
        Console.WriteLine(sortedList1.ContainsValue("Jane Doe"))   ' True
        '
        sortedList1.Remove("0123/456.789")
        sortedList1.RemoveAt(0)
        '
        sortedList1.Clear()
        Console.WriteLine(sortedList1.Capacity)                    ' 2
        Console.WriteLine(sortedList1.Count)                       ' 0
        '
        Console.ReadLine()
    End Sub
    Public Shared Sub PrintSortedList(ByVal sortedList As SortedList)
        For Each element As DictionaryEntry In sortedList                  ' (7)
            If element.Key IsNot Nothing Then
                Console.Write(element.Key.ToString() & " : ")
            End If
            If element.Value IsNot Nothing Then
                Console.WriteLine(element.Value.ToString())
            End If
        Next
        ' or :
        'For index As Integer = 0 To sortedList.Count - 1
        '    If sortedList.GetKey(index) IsNot Nothing Then
        '        Console.Write(sortedList.GetKey(index).ToString() & " : ")
        '    End If
        '    If sortedList.GetByIndex(index) IsNot Nothing Then
        '        Console.WriteLine(sortedList.GetByIndex(index).ToString())
        '    End If
        'Next
    End Sub
    Public Shared Sub PrintSortedListKeys(ByVal sortedList As SortedList)
        For Each element As Object In sortedList.Keys                      ' (8)
            If element IsNot Nothing Then
                Console.WriteLine(element.ToString())
            End If
        Next
    End Sub
    Public Shared Sub PrintSortedListValues(ByVal sortedList As SortedList)
        For Each element As Object In sortedList.Values                    ' (9)
            If element IsNot Nothing Then
                Console.WriteLine(element.ToString())
            End If
        Next
    End Sub
End Class
Console Application Output
0
0
16
2
0123/456.789 : John Doe
0234/567.890 : Jane Doe
0123/456.789
0234/567.890
John Doe
Jane Doe
0234/567.890
Jane Doe
John Doe
Tom Doe
1
1
2
2
True
True
True
2
0
(1) : De default capaciteit is 0, bij het toevoegen van een eerste element wordt de capaciteit uitgebreid naar 16.  Bij het construeren van een SortedList instantie kan men aan de constructor een afwijkende capaciteit opgeven.

(2) : Via de default "indexer" Item kan men - niet op basis van een index, maar - op basis van een key, de value in Object vorm opvragen of instellen.

(3) : De IndexOfKey method levert de index op van een bepaalde key.

(4) : De IndexOfValue method levert de key-index op van de eerste value die gelijk is aan het opgegeven argument.   Er kunnen immers meerdere keys geassocieerd zijn met dezelfde value.

(5) : TrimToSize zet de capaciteit gelijk aan het aantal elementen.

(6) : De Contains en ContainsKey gedragen zich op dezelfde wijze, en zal nagaan of er zich in de collectie een element bevindt met de opgeven key.
De IComparable.CompareTo implementatie van het keytype of de IComparer.Compare implementatie worden gebruikt om na te gaan of verschillende elementen gelijk zijn aan elkaar.
Zie de topics over de IComparable en IComparer interfaces voor meer details.

(7) : Als men de elementen van de SortedList overloop met een For Each iteratie zullen de opgeleverde elementen steeds van het type System.Collections.DictionaryEntry zijn.  Deze hebben een Key en Value property die steeds in Object vorm de desbetreffende key of value oplevert.

(8) : De Keys property van een SortedList levert een collectie op met daarin alle keywaarden.  We kunnen over deze collectie itereren met een For Each.  Alle elementen worden in Object vorm opgeleverd, in volgorde van hun sortering.

(9) : De Values property van een SortedList levert een collectie op met daarin alle values.  We kunnen over deze collectie itereren met een For Each.  Ook hier worden alle elementen in Object vorm opgeleverd, in volgorde van hun sortering.

De SortedList klasse heeft geen Reverse of Sort methods gezien de elementen steeds gesorteerd zijn.

22.18.2. SortedList Is een Dictionary

Onthoud dat een SortedList nog altijd een dictionary is.  Met als belangrijke functionaliteit het opvragen van de value op basis van de key.

Het blijft zo dat elke key uniek moet zijn, wat in deze context met uniek wordt bedoeld kan je nalezen in het volgende topic.  Dit is voor alle duidelijkheid niet gebaseerd op de Equals implementatie van de elementen, maar wel op de - eventueel toe te voegen - CompareTo implementatie van de elementen.

Values mogen nog altijd meermaals (bij verschillende keys) voorkomen.

Een key mag nog altijd niet Nothing zijn :
Visual Basic 2012 Broncode - Codevoorbeeld 573
Namespace SortedListAddNothingExample
    Class Client
        Public Shared Sub Main()
            Dim sortedList1 As New SortedList
            sortedList1.Add(Nothing, "value1") ' ArgumentNullException
        End Sub
    End Class
End Namespace
Probeer je toch Nothing als key voor een toe te voegen element te gebruiken, dan krijg je at runtime een ArgumentNullException.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.