gpt4 book ai didi

c# - IEquatable.Equals 中的条件

转载 作者:行者123 更新时间:2023-11-30 20:09:15 25 4
gpt4 key购买 nike

我已经实现了IEquatable<T>比较两个列表中的对象但是我想有条件地这样做:

public bool Equals(CustomerType other)
{

if (this.Zipcode == "11111" || this.Zipcode == "22222" || this.Zipcode== "33333")
{
return this.FirstName.Equals(other.FirstName) && this.LastName.Equals(other.LastName) && this.MiddleName.Equals(other.MiddleName);
}
else
{
return this.FirstName.Equals(other.FirstName);
}
}

这里出了点问题,它永远不会进入 else 状态。有人可以告诉我哪里出错了吗?

--用法--

var v = listA.Except(listB).ToList();

--GetHashCode实现--

    public override int GetHashCode()
{
unchecked
{

int hash = 17;
hash = hash * 23 + this.intField1.GetHashCode();
hash = hash * 23 + this.intField2.GetHashCode();
hash = hash * 23 + this.stringField3.GetHashCode();
hash = hash * 23 + this.doubleField4.GetHashCode();
hash = hash * 23 + this.doubleField5.GetHashCode();

return hash;
}
}

--等于--

    public override bool Equals(object obj) 
{
if (obj == null) return base.Equals(obj);
if (obj is CustomerType )
{
return this.Equals((CustomerType)obj);
}
else
{
return false;
}
}

--例子--

ListA 有 2 个客户:

客户 1:名字 - “A”姓氏 - “Z”中间名 - “Y”邮政编码 - “11111”

客户 2:名字 - “B”姓氏 - “X”中间名 - “W”邮政编码 - “44444”

ListB 有 2 个客户:

客户 1:名字 - “A”姓氏 - “Z”中间名 - “Y”邮政编码 - “11111”

客户 2:名字 - “B”姓氏 - “G”中间名 - “G”邮政编码 - “44444”

在这里,当我说 ListA.Except(ListB) 时,它应该将 CustA 与 FirstName、MiddleName、LastName 进行比较,因为它属于邮政编码 11111,而 CustB 只有 FirstName,当我说 ListB.Except(ListA) 时同样适用。当前 Equals 实现中发生的事情是它与 ListA.Except(ListB) 一起工作正常,但是当我说 ListB.Except(ListA) 时,它比较 CustB 的 FirstName、LastName 和 Middlename。

最佳答案

我很确定您没有正确实现 GetHashCode()。每当您覆盖 Equals 时,您都必须覆盖 GetHashCode() 以便它们保持一致。

条件是如果对于两个对象 o1.Equals(o2) 返回 true 那么 GetHashCode 的结果必须相同。

因为 Except 在内部使用哈希集,所以 GetHashCode() 的实现在这里是相关的。如果没有哈希集,它的复杂度将从 O(n) 增加到 O(n^2),这显然是不可取的。

除此之外,Equals 应该是对称的,而你的不是。


查看您的 GetHashCode() 函数,这显然是错误的。它考虑了 Equals 没有考虑的字段。

每当您的代码进入 ifthen 部分时,它可能需要 FirstNameLastNameMiddleName 考虑在内。当您的代码进入 else 部分时,对于 GetHashCode(),它可能只会考虑 FirstName

public override int GetHashCode()
{
unchecked
{
if (this.Zipcode == "11111" || this.Zipcode == "22222" || this.Zipcode== "33333")
{
return FirstName.GetHashCode()*529+
LastName.GetHashCode()*23+
MiddleName.GetHashCode();
}
else
{
return FirstName.GetHashCode();
}
}

但即使使用 GetHashCode() 的实现,您仍然应该修复 Equals

的对称性

关于c# - IEquatable<T>.Equals 中的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297160/

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