|
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.13.1. IEqualityComparerIndien je een datatype dat je als keytype wil gebruiken in een dictionary niet kan aanpassen, en met andere woorden de Equals of GetHashCode niet kunt overschrijven, dan is het nog altijd mogelijk een IEqualityComparer object door te geven aan de constructor van het Hashtable object.
Dergelijk comparer object implementeert de System.Collections.IEqualityComparer interface, deze heeft volgende members : - Function Equals(ByVal x As Object, ByVal y As Object) As Boolean en - Function GetHashCode(ByVal obj As Object) As Integer
De Hashtable kan vervolgens van dit comparer object gebruik maken om te weten welke objecten van het keytype als logisch gelijk worden beschouwd en om te weten wat de hash code is van de keyobjecten. Visual Basic 2010 Broncode Public Enum File FileA FileB End EnumPublic Enum Rank Rank1 Rank2 End EnumPublic Class Square Public Sub New( ByVal file As File, ByVal rank As Rank) _File = file _Rank = rank End Sub Private ReadOnly _File As File Public ReadOnly Property File() As File Get File = _File End Get End Property Private ReadOnly _Rank As Rank Public ReadOnly Property Rank() As Rank Get Rank = _Rank End Get End PropertyEnd ClassClass SquareComparer : Implements IEqualityComparer Public Function Equals( ByVal x As Object, ByVal y As Object) As Boolean _ Implements IEqualityComparer.Equals If x IsNot Nothing AndAlso y IsNot Nothing AndAlso _ TypeOf x Is Square AndAlso TypeOf y Is Square Then Dim squareX As Square = DirectCast(x, Square) Dim squareY As Square = DirectCast(y, Square) Equals = (x.Rank = y.Rank AndAlso x.File = y.File) End If End Function Public Function GetHashCode( ByVal obj As Object) As Integer _ Implements IEqualityComparer. GetHashCode If obj IsNot Nothing AndAlso TypeOf obj Is Square Then Dim square As Square = DirectCast(obj, Square) GetHashCode = square.File Xor square.Rank End If End FunctionEnd ClassClass Client Public Shared Sub Main() Dim square1 As New Example1. Square(File.FileA, Rank.Rank1) Dim square2 As New Example1. Square(File.FileB, Rank.Rank1) Dim square3 As New Example1. Square(File.FileA, Rank.Rank1) Dim board As New Hashtable( New SquareComparer) board.Add(square1, "R") board.Add(square2, "K") Console.WriteLine(board.Item(square1).ToString()) Console.WriteLine(board.Item(square2).ToString()) Console.WriteLine(board.Item(square3).ToString()) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output R
K
R Bovenstaande werkwijze is ook bruikbaar indien je wenst dat de Hashtable van een alternatieve Equals en GetHashcode strategie moet gebruik maken. Hierbij dus veronderstelt dat er reeds een Equals en GetHashCode implementatie aanwezig was in het keytype, maar je hiervan voor een bepaalde Hashtable wenst af te zien.
Uiteraard is het zo dat je in de implementatie van de members uit deze interface beperkt bent, je kan immers enkel van de publieke members van het keytype gebruik maken. Dit in tegenstelling tot herdefinities van Equals en GetHashCode die je in het keytype zelf plaats, daar heb je toegang tot alle members, ook de ingekapselde.
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|