|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
22.11.1. Dictionary CollectiesNaast 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. boven
22.11.2. HashtableHieronder 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 2010 Broncode Namespace Example1 Public Class Person Protected _ID As Integer Public Property ID() As Integer Get ID = _ID End Get Set( ByVal value As Integer) _ID = value End Set End Property Protected _Name As String Public Property Name() As String Get Name = _Name End Get Set( ByVal value As String) _Name = value End Set End Property 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) hashtable1.Add(person2.ID, person2) hashtable1.Add(4, person1) Console.WriteLine(hashtable1.Item(person1.ID).ToString()) Console.WriteLine(hashtable1.Item(2).ToString()) Console.WriteLine(hashtable1.Item(3) Is Nothing) Console.WriteLine(hashtable1.Item(4).ToString()) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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). boven
22.11.3. Count, Contains, Remove en Clear MethodsHet 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.
Contains, ContainsKey en ContainsValue leveren True of False op naargelang er zich een entry met de gespecifieerde key of value in de Hashtable bevindt. Contains en ContainsKey gedragen zich op dezelfde wijze. Visual Basic 2010 Broncode 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) Console.WriteLine(hashtable1.Contains(1)) Console.WriteLine(hashtable1.ContainsKey(1)) Console.WriteLine(hashtable1.ContainsValue(person1)) hashtable1.Remove(person2.ID) hashtable1.Remove(3) Console.WriteLine(hashtable1.Count) Console.WriteLine(hashtable1.Contains(3)) hashtable1.Clear() Console.WriteLine(hashtable1.Count) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 3
True
True
True
1
False
0 boven
22.11.4. Itereren over een HashtableIn 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 2010 Broncode 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 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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|