gpt4 book ai didi

.net - 找出两个列表之间的差异

转载 作者:行者123 更新时间:2023-12-04 15:44:51 28 4
gpt4 key购买 nike

在我当前的项目中,我试图比较两个对象列表,找出对象是否已添加、删除、更改或保持不变。

我正在利用 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()

为此,我必须实现 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

添加成员列表的散列,在检查实例时总是返回不同的散列,而不是内容。这暂时有效,但当然消除了拥有哈希的所有优势。

更新
我要找的是 不是 一个更好的 Equals 方法,但我质疑我的整个方法(也许有一些 OOTB,我应该使用不同的界面)。如果做不到这一点,当我的属性(property)集合应该被考虑在内时,我怎么能有一个好的 GetHashcode?

最佳答案

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

关于.net - 找出两个列表之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20330234/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com