【发布时间】:2011-09-11 22:25:24
【问题描述】:
我已经实现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 进行比较,因为它属于 Zipcode 11111 和只有 FirstName 的 CustB,当我说 ListB.Except(ListA) 时也是如此。当前 Equals 实现中发生的情况是它可以与 ListA.Except(ListB) 一起正常工作,但是当我说 ListB.Except(ListA) 时,它会比较 CustB 的 FirstName、LastName 和 Middlename。
【问题讨论】:
-
我们能看到实际使用它的代码吗?我怀疑问题出在哪里,但想通过查看您的使用方式来验证。
-
@Eric Petroelje - 编辑了代码用法
-
你是否也覆盖了正常的等于?
-
是的。我做到了。通过实施编辑了问题。
-
现在它返回包含邮政编码不是 11111 或 22222 或 33333 的客户的列表。它不只比较名字
标签: c# linq comparison