找到两个列表之间的差异

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?

Jon*_*jap 1

我认为Enumerable.SequenceEqual应该解决这个问题,因为它总是使用默认的相等比较器而不需要实现IEqualityComparer. 但需要注意的是,它还会检查订单比较。