|
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.17.1. Dictionary en List CollectieEen 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 2010 Broncode Class Example1 Public Shared Sub Main() Dim sortedList1 As New System.Collections. SortedList Console.WriteLine(sortedList1.Capacity) Console.WriteLine(sortedList1.Count) sortedList1.Add( "0123/456.789", "John Doe") sortedList1.Add( "0234/567.890", "Jane Doe") Console.WriteLine(sortedList1.Capacity) Console.WriteLine(sortedList1.Count) PrintSortedList(sortedList1) PrintSortedListKeys(sortedList1) PrintSortedListValues(sortedList1) Console.WriteLine(sortedList1.GetKey(1)) Console.WriteLine(sortedList1.GetByIndex(1)) Console.WriteLine(sortedList1.Item( "0123/456.789")) sortedList1.Item( "0123/456.789") = "Tom Doe" Console.WriteLine(sortedList1.Item( "0123/456.789")) Console.WriteLine(sortedList1.IndexOfKey( "0234/567.890")) Console.WriteLine(sortedList1.IndexOfValue( "Jane Doe")) sortedList1.TrimToSize() Console.WriteLine(sortedList1.Count) Console.WriteLine(sortedList1.Capacity) Console.WriteLine(sortedList1.Contains( "0234/567.890")) Console.WriteLine(sortedList1.ContainsKey( "0234/567.890")) Console.WriteLine(sortedList1.ContainsValue( "Jane Doe")) sortedList1.Remove( "0123/456.789") sortedList1.RemoveAt(0) sortedList1.Clear() Console.WriteLine(sortedList1.Capacity) Console.WriteLine(sortedList1.Count) Console.ReadLine() End Sub Public Shared Sub PrintSortedList( ByVal sortedList As SortedList) For Each element As DictionaryEntry In sortedList 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 End Sub Public Shared Sub PrintSortedListKeys( ByVal sortedList As SortedList) For Each element As Object In sortedList.Keys 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 If element IsNot Nothing Then Console.WriteLine(element.ToString()) End If Next End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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. boven
22.17.2. SortedList Is een DictionaryOnthoud 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 2010 Broncode Namespace SortedListAddNothingExample Class Client Public Shared Sub Main() Dim sortedList1 As New SortedList sortedList1.Add( Nothing, "value1") End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|