Bor*_*ens 6 .net vb.net hash equality
在我当前的项目中,我试图比较两个对象列表,找出对象是否已添加,删除,更改或保持不变.
我正在利用IEnumerable.Except
以下内容:
Dim newOnes = current.Except(previous, equalityComparer).ToList
Dim removedOnes = previous.Except(current, equalityComparer).ToList()
Dim existingOnes = current.Except(newOnes, equalityComparer).ToList
Dim changedOnes = existingOnes.Except(previous, changedComparer).ToList()
Dim unchangedOnes = existingOnes.Except(changedOnes, equalityComparer).ToList()
Run Code Online (Sandbox Code Playgroud)
为此,我必须实现IEqualityComparers.
找出一对对象在属性值(changedOnes)中是否发生了变化,需要我编写一个'changedComparer',它是一个IEqualityComparer,它检查非身份定义字段(例如成员集合).
因为Except方法显然首先检查GetHashCode并且如果哈希值相等则不会转到Equals方法,我的设置就会崩溃.
我目前正在解决这个问题如下:
Public Overloads Function GetHashCode(obj As Family) As Integer Implements IEqualityComparer(Of Family).GetHashCode
Dim hashCode As Long = 17
If obj.ClientCode IsNot Nothing Then hashCode = CInt(((hashCode * 397) Xor obj.ClientCode.GetHashCode()) Mod Integer.MaxValue)
' SNIP a bunch more property fields
If obj.Members IsNot Nothing Then hashCode = CInt(((hashCode * 397) Xor obj.Members.GetHashCode()) Mod Integer.MaxValue)
Return CInt(hashCode Mod Integer.MaxValue)
End Function
Run Code Online (Sandbox Code Playgroud)
添加成员列表的哈希值时,总是会在检查实例时返回不同的哈希值,而不是内容.这暂时适用,但当然会消除哈希的所有优点.
更新
我正在寻找的不是一个更好的Equals方法,但我质疑我的整个方法(也许有一些OOTB,我应该使用不同的接口).如果不这样做,当我的财产收集应该考虑在内时,我怎么能有一个好的GetHashcode?
归档时间: |
|
查看次数: |
185 次 |
最近记录: |