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.21. SortedList en de IComparer Interface

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.21.1. System.Collections.IComparer

Vergelijkbaar met een IEqualityComparer object die je aan een Hashtable kan doorgeven, bestaat er ook een IComparer interface waarvan men objecten van implementerende types aan de constructor van een SortedList kan doorgeven.

De interface System.Collections.IComparer heeft één method, namelijk : Function Compare(ByVal x As Object, ByVal y As Object) As Integer

De implementatie van deze method zou moeten aangeven welke vergelijkingsstrategie door de SortedList moet worden gebruikt.

In onderstaand voorbeeld wordt aan de constructor sortedList2 een object ( comparer1) doorgegeven die van een type is (SomeKeyComparer) die de IComparer interface implementeert.
Type SomeKeyComparer heeft aan dat twee SomeKey instanties op basis van hun Value2 worden vergeleken :
Visual Basic 2012 Broncode - Codevoorbeeld 582
Namespace IComparerExample
    Class SomeKey : Implements IComparable
        Public Value1 As Integer
        Public Value2 As Integer
        Public Function CompareTo(ByVal obj As Object) As Integer _
                                         Implements System.IComparable.CompareTo
            If obj Is Nothing Then
                CompareTo = 1
            ElseIf Not TypeOf obj Is SomeKey Then
                Throw New ArgumentException("An invalid argument was " & _
                         "specified.  An argument of type SomeKey is required.")
            Else
                CompareTo = Me.Value1.CompareTo(DirectCast(obj, SomeKey).Value1)
            End If
        End Function
    End Class
    Class SomeKeyComparer : Implements IComparer
        Public Function Compare(ByVal x As Object, ByVal y As Object) _
                      As Integer Implements System.Collections.IComparer.Compare
            If x IsNot Nothing AndAlso y Is Nothing Then
                Return 1
            ElseIf x Is Nothing AndAlso y IsNot Nothing Then
                Return -1
            ElseIf x IsNot Nothing AndAlso y IsNot Nothing Then
                If TypeOf x Is SomeKey AndAlso TypeOf y Is SomeKey Then
                    Compare = DirectCast(x, SomeKey).Value2. _
                                        CompareTo(DirectCast(y, SomeKey).Value2)
                Else
                    Throw New ArgumentException("x and y are of different " & _
                 "types and neither one can handle comparisons with the other.")
                End If
            End If
        End Function
    End Class
    Class Client
        Public Shared Sub Main()
            Dim key1 As New SomeKey With {.Value1 = 1, .Value2 = 3}
            Dim key2 As New SomeKey With {.Value1 = 2, .Value2 = 2}
            Dim key3 As New SomeKey With {.Value1 = 3, .Value2 = 1}
            '
            Dim comparer1 As IComparer = New SomeKeyComparer
            '
            Dim sortedList1 As New SortedList()
            Dim sortedList2 As New SortedList(comparer1)
            '
            sortedList1.Add(key1, "value1")
            sortedList1.Add(key2, "value2")
            sortedList1.Add(key3, "value3")
            '
            sortedList2.Add(key1, "value4")
            sortedList2.Add(key2, "value5")
            sortedList2.Add(key3, "value6")
            '
            For Each entry As DictionaryEntry In sortedList1
                Console.WriteLine(entry.Value)
            Next
            Console.WriteLine()
            '
            For Each entry As DictionaryEntry In sortedList2
                Console.WriteLine(entry.Value)
            Next
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
value1
value2
value3

value6
value5
value4
Bemerk dat opnieuw, net als in een IComparable.CompareTo implementatie, elk object als groter wordt beschouwd dan Nothing.

Bovenstaande werkwijze (het doorgeven van een IComparer object aan de constructor van een SortedList) kan dus gebruikt worden indien :

- Men in een bepaalde context, bijvoorbeeld voor een bepaalde SortedList instantie, een andere/alternatieve vergelijkingsstrategie wil gebruiken.
Ook in de context van een Array.Sort of ArrayList.Sort bijvoorbeeld kan een IComparer worden gebruikt.  Ook van deze methods bestaan er overladen versies met IComparer argument.

- Men het keytype niet kan aanpassen, en er dus bijvoorbeeld niet de IComparable interface in kan implementeren.

De implementatie binnen deze IComparer.Compare method is natuurlijk beperkt, zo kan men enkel aan de publieke members van de twee objecten die worden vergeleken.
Dit in tegenstelling tot de IComparable.CompareTo implementatie die bijvoorbeeld in het keytype zelf wordt aangebracht, en waar je dus toegang hebt tot alle members, bijvoorbeeld ook de ingekapselde (Private of Protected) members.

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