我正在尝试与两个相同类型的对象进行比较,并确定它们是否相同。我有
objA IS objB
还
objA.Equals(objB)
但是每次我得到 false 时。这是我正在尝试的代码
Public Class RowsDetails
Property RelatedEmployee As String = String.Empty
Property RelatedNumberAs String = String.Empty
Property Type As String = String.Empty
Property ReportType As String = String.Empty
Property status As String = String.Empty
Property Term As String = String.Empty
Property Currency As String = String.Empty
End Class
所有属性在objA和objB中具有相同的值。我已经阅读了一些有关实现 IEquatable(of T) 的文章。
但是它们大多看起来像自定义逻辑。 我想知道有没有简单的方法可以做到这一点?
先谢谢了。
答案 0 :(得分:2)
每次比较两个对象时,都必须建立确定等效性的方法。
有3种主要的等效形式:
类型等效:使用TypeOf
运算符完成。可以找到谁的行为here
引用等效项:使用is
运算符完成。 found here
值相等(这似乎是您尝试做的事情)要求定义比较方法。否则,将通过使用默认的Equals()方法来做出最佳猜测。
如果这些都不适合您,那么您必须定义自己的比较方法。
除了实现IEquatable()或重载Equals()之外,唯一的其他方法是对两个对象进行哈希处理并进行比较。
答案 1 :(得分:1)
Object.Equals(Object)
是您调用objA.Equals(objB)
时所调用的。比较的是,它们是否指向同一个对象。
Dim objA as New RowDetails()
Dim objB = objA
现在它们都指向同一个对象。所以...
objA.Equals(objB)
返回True 但是在两者上都使用New关键字将创建2个不同的引用,因此它们与.Equals的默认实现不相等。
向您的RowDetails类添加以下内容。
Public Overrides Function Equals(obj As Object) As Boolean
Dim rowDet As RowsDetails = TryCast(obj, RowsDetails)
If rowDet Is Nothing Then
Return False
'The AndAlso will short circuit as soon as it finds a false
ElseIf RelatedEmployee = rowDet.RelatedEmployee AndAlso RelatedNumber = rowDet.RelatedNumber AndAlso Type = rowDet.Type Then 'and the rest of the properties
Return True
End If
Return False
End Function
答案 2 :(得分:0)
感谢您的更新。
我使用了.Equals()方法并比较了这些值。