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.12. Dictionary Collecties

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.12.1. Dictionary Collecties

Naast de list collecties zijn ook "dictionaries" een belangrijke categorie binnen de collectietypes.

De elementen/entries van een dictionary zijn steeds een combinatie van een "value" ("waarde") en een "key" ("sleutel").
De belangrijkste functionaliteiten van een dictionary is het opzoeken van een value op basis van de key.  Net als men op basis van een woord (de key) in een woordenboek (de dictionary) een verklaring van dat woord (de value) gaat opzoeken.

Net als in een woordenboek is het voor alle dictionaries zo dat elke key uniek moet zijn, values daarentegen mogen meermaals - bij verschillende keys - voorkomen.

Twee in de System.Collections namespace voorgedefinieerd dictionarytypes zijn Hashtable en SortedList.

Bij het toevoegen via de Add method van een entry aan dergelijke dictionaries worden steeds key en value opgegeven.
De Item method kan gebruikt worden om op basis van de key (als parameter) de value (als returnwaarde) op te vragen.

22.12.2. Hashtable

Hieronder vind je een voorbeeld terug waarin gewerkt wordt met een Hashtable.

Het uitgangspunt is dat we op basis van een ID van een Person heel snel die persoon kunnen terugvinden.  De ID waarde van een Person object is hier dus de key, het Person object zelf - met deze ID waarde - is de value :
Visual Basic 2012 Broncode - Codevoorbeeld 548
Namespace Example1
    Public Class Person
        Public Property ID As Integer
        Public Property Name As String
        Public Overrides Function ToString() As String
            ToString = Name
        End Function
    End Class
    Public Class Client
        Public Shared Sub Main()
            Dim person1 As New Person With {.ID = 1, .Name = "John"}
            Dim person2 As New Person With {.ID = 2, .Name = "Jane"}
            Dim person3 As New Person With {.ID = 1, .Name = "Paul"}
            '
            Dim hashtable1 As New Hashtable
            hashtable1.Add(1, person1)                                     ' (1)
            hashtable1.Add(person2.ID, person2)
            'hashtable1.Add(person3.ID, person3) ' ArgumentException         (2)
            hashtable1.Add(4, person1)                                     ' (3)
            'hashtable1.Add(Nothing, person3) ' ArgumentNullException      ' (4)
            '
            Console.WriteLine(hashtable1.Item(person1.ID).ToString()) ' John
            Console.WriteLine(hashtable1.Item(2).ToString())          ' Jane
            Console.WriteLine(hashtable1.Item(3) Is Nothing)          ' True (5)
            Console.WriteLine(hashtable1.Item(4).ToString())          ' John
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
John
Jane
True
John
Bemerk dat bovenstaand voorbeeld probeert te illustreren hoe elke sleutel uniek moet zijn.  Regel (2) zou dan ook at runtime leiden tot een ArgumentException.

We kunnen echter wel verschillende malen ((1) en (3)) dezelfde waarde ( person1) voor verschillende entries gebruiken.

Om Hashtable breed inzetbaar te houden, heeft men ervoor gekozen steeds met keys en values te werken van statisch type Object.
Men kan dus in principe objecten van eender welk type als key of value gebruiken, of anders gezegd men kan eender wat doorgeven als argumentwaardes voor de Add method.
Er zijn echter wel wat vereisten voor het keytype, hierover verderop meer details, maar elke type kan - mits de vereiste aanpassingen - als keytype worden gebruikt.

Het is niet mogelijk Nothing als keywaarde te gebruiken, dit zou leiden tot een ArgumentNullException (4).

De Item method heeft als returntype Object.  Indien geen value wordt gevonden voor de gespecifieerde key levert deze method dan ook Nothing op (5).

22.12.3. Count, Contains, Remove en Clear Methods

Het aantal elementen kan worden nagegaan via de Count property.

Een element verwijderen kan door bij een call naar de Remove method te specifiëren wat de key is van de entry die wordt verwijderd.
Alle elementen kan men verwijderen via de Clear method.

Methods Contains, ContainsKey en ContainsValue leveren True of False op naargelang er zich een entry met de gespecifieerde key of value in de Hashtable bevindt.
Methods Contains en ContainsKey gedragen zich op dezelfde wijze.
Visual Basic 2012 Broncode - Codevoorbeeld 549
Namespace Example2
    Public Class Client
        Public Shared Sub Main()
            Dim person1 As New Example1.Person With {.ID = 1, .Name = "John"}
            Dim person2 As New Example1.Person With {.ID = 2, .Name = "Jane"}
            Dim person3 As New Example1.Person With {.ID = 3, .Name = "Paul"}
            '
            Dim hashtable1 As New Hashtable
            hashtable1.Add(person1.ID, person1)
            hashtable1.Add(2, person2)
            hashtable1.Add(person3.ID, person3)
            '
            Console.WriteLine(hashtable1.Count)                  ' 3
            Console.WriteLine(hashtable1.Contains(1))            ' True
            Console.WriteLine(hashtable1.ContainsKey(1))         ' True
            Console.WriteLine(hashtable1.ContainsValue(person1)) ' True
            '
            hashtable1.Remove(person2.ID)
            hashtable1.Remove(3)
            '
            Console.WriteLine(hashtable1.Count)                  ' 1
            Console.WriteLine(hashtable1.Contains(3))            ' False
            '
            hashtable1.Clear()
            Console.WriteLine(hashtable1.Count)                  ' 0
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
3
True
True
True
1
False
0

22.12.4. Itereren over een Hashtable

In tegenstelling tot list collecties waar de elementen in een specifieke volgorde staan, bijvoorbeeld dezelfde volgorde als ze aan de collectie worden toegevoegd, zijn de entries van een dictionary niet in een welgedefinieerde volgorde geplaatst.
Er is natuurlijk wel een waarneembare volgorde van de elementen.  Zo zie je bijvoorbeeld in onderstaand voorbeeld bij het itereren over de elementen de elementen in omgekeerde volgorde (omgekeerd dan toegevoegde volgorde) naar voor komen.  Dit is echter "toevallig" zo bij deze implementatie van HashTable of toch op zijn minst iets dat de abstractie van dictionaries niet garandeert.
Met andere woorden is het zo dat je geen aanname mag doen over de volgorde van de elementen van een dictionary, die is in principe willekeurig.

Gezien er geen specifieke volgorde is tussen de elementen onderling, is het bijvoorbeeld ook niet mogelijk elementen in te voegen.  Een method als Insert die je bij list collecties doorgaans wel hebt, is hier dus niet aanwezig.

Bij het itereren in onderstaand voorbeeld over de elementen van hashtable1 (1) zie je hoe elk element van het type DictionaryEntry is.  Dit is een eenvoudig containertype met een Key en Value property, beide van type Object.

Het is ook mogelijk via de Keys en Values properties van de HashTable enkel de sleutels of waardes op te vragen :
Visual Basic 2012 Broncode - Codevoorbeeld 550
Namespace Example3
    Public Class Client
        Public Shared Sub Main()
            Dim person1 As New Example1.Person With {.ID = 1, .Name = "John"}
            Dim person2 As New Example1.Person With {.ID = 2, .Name = "Jane"}
            Dim person3 As New Example1.Person With {.ID = 3, .Name = "Paul"}
            '
            Dim hashtable1 As New Hashtable
            hashtable1.Add(person1.ID, person1)
            hashtable1.Add(person2.ID, person2)
            hashtable1.Add(person3.ID, person3)
            '
            Console.WriteLine("Entries :")
            For Each entry As DictionaryEntry In hashtable1                ' (1)
                Console.WriteLine("key : " & entry.Key.ToString() & ", " & _
                                  "value : " & entry.Value.ToString())
            Next
            '
            Console.WriteLine("Keys :")
            For Each value As Object In hashtable1.Keys
                Console.WriteLine(value.ToString())
            Next
            Console.WriteLine()
            '
            Console.WriteLine("Values :")
            For Each value As Object In hashtable1.Values
                Console.WriteLine(value.ToString())
            Next
            Console.WriteLine()
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Entries :
key : 3, value : Paul
key : 2, value : Jane
key : 1, value : John

Keys :
3
2
1

Values :
Paul
Jane
John

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