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.14. Hashtable - IEqualityComparer

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.14.1. IEqualityComparer

Indien 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 2012 Broncode - Codevoorbeeld 558
Public Enum File
    FileA
    FileB
    ' ...
End Enum
Public Enum Rank
    Rank1
    Rank2
    ' ...
End Enum
Public 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 Property
End Class
Class 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 Function
End Class
Class 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()) ' R
        Console.WriteLine(board.Item(square2).ToString()) ' K
        Console.WriteLine(board.Item(square3).ToString()) ' R
        '
        Console.ReadLine()
    End Sub
End Class
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 maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.