0

我为代表数据库对象的类创建了一个 IEqualityComparer,我想重写这些类的 Equals 方法,以便在调用 Equals、Contains 等时比较对象的 Id。问题是我的 Equals 函数是从来没有打电话,谁能明白为什么测试总是返回假?

谢谢!

DatabaseEntityEqualityComparer.vb

Imports System.Collections.Generic

Public Class DatabaseEntityEqualityComparer
    Implements IEqualityComparer(Of IDatabaseEntity)

    Public Overloads Function Equals(x As IDatabaseEntity, y As IDatabaseEntity) As Boolean Implements IEqualityComparer(Of IDatabaseEntity).Equals

        'check whether the compared objects reference the same data
        If x Is y Then Return True

        'check whether any of the compared objects is null
        If x Is Nothing OrElse y Is Nothing Then Return False

        'check whether the IDatabaseEntity properties are equal, and are of the same type
        Return (x.Id = y.Id) AndAlso (x.GetType() = y.GetType())

    End Function

    Public Overloads Function GetHashCode(obj As IDatabaseEntity) As Integer Implements IEqualityComparer(Of IDatabaseEntity).GetHashCode

        If obj Is Nothing Then
            Return 0
        End If

        Return obj.Id.ToString().GetHashCode()

    End Function

End Class

IDatabaseEntity.vb

Public Interface IDatabaseEntity

    Property Id As Integer

End Interface

人物.vb

Public Class Person
    Implements IDatabaseEntity

    Public Property Id As Integer Implements IDatabaseEntity.Id

End Class

运行测试

Dim p1 As New Person()
p1.Id = 1

Dim p2 As New Person()
p2.Id = 1

If p1.Equals(p2) Then
    Response.Write("Equals")            
Else
    Response.Write("Not Equals")
End If

Response.End()
4

1 回答 1

2

AnIEqualityComparer是一个允许创建自定义平等比较器的接口。例如,您可以在许多 LINQ 方法(如IntersectExceptGroupBy等)中使用它Join。但是您必须将比较器的实例传递给这些方法。

如果你想改变覆盖EqualsGetHashCode一般来说:

Public Class Person
    Implements IDatabaseEntity

    Public Property Id As Integer Implements IDatabaseEntity.Id

    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is Nothing Then Return False
        If Object.ReferenceEquals(Me, obj) Then Return True
        Dim Person2 As Person = TryCast(obj, Person)
        If Person2 Is Nothing Then Return False
        Return Person2.Id = Id
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return Id
    End Function

End Class

如果你想使用你的比较器,你可以这样使用它Equals

Dim comparer = New DatabaseEntityEqualityComparer()
If comparer.Equals(p1, p2) Then
    Response.Write("Equals")   
End If
于 2013-11-05T15:10:15.830 回答