|
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.20.1. System.Collections.IComparerVergelijkbaar 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. SomeKeyComparer heeft aan dat twee SomeKey instanties op basis van hun Value2 worden vergeleken : Visual Basic 2010 Broncode 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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|