在比较自定义对象的两个集合时,我在使用 Linq 的 .Except() 方法时遇到了一些困难。
我已经从 、 和运算符 和 派生了我的类并实现了Object
覆盖。我还创建了一个方法。Equals()
GetHashCode()
==
!=
CompareTo()
在我的两个集合中,作为调试实验,我从每个列表中取出第一项(这是重复的)并进行比较如下:
itemListA[0].Equals(itemListB[0]); // true
itemListA[0] == itemListB[0]; // true
itemListA[0].CompareTo(itemListB[0]); // 0
在所有三种情况下,结果都是我想要的。但是,当我使用 Linq 的 except() 方法时,不会删除重复的项目:
List<myObject> newList = itemListA.Except(itemListB).ToList();
了解 Linq 如何进行比较时,我发现了各种(冲突的?)方法,这些方法说我需要继承自IEquatable<T>
orIEqualityComparer<T>
等。
我很困惑,因为例如,当我从 继承时IEquatable<T>
,我需要提供一个新Equals()
方法,其签名与我已经覆盖的签名不同。我是否需要两个具有不同签名的此类方法,或者我应该不再从 派生我的类Object
?
我的对象定义(简化)如下所示:
public class MyObject : Object
{
public string Name {get; set;}
public DateTime LastUpdate {get; set;}
public int CompareTo(MyObject other)
{
// ...
}
public override bool Equals(object obj)
{
// allows some tolerance on LastUpdate
}
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + Name.GetHashCode();
hash = hash * 23 + LastUpdate.GetHashCode();
return hash;
}
}
// Overrides for operators
}
我注意到,当我从继承时,IEquatable<T>
我可以使用IEquatable<MyObject>
or IEquatable<object>
; Equals()
当我使用其中一种时,签名的要求会发生变化。推荐的方法是什么?
我要完成的工作:
我希望能够在不重复代码的情况下使用 Linq (Distinct/Except) 以及标准相等运算符 ( ==
and )。如果两个对象的名称相同并且属性在几秒(用户指定的)容差范围内,则!=
比较应该允许将两个对象视为相等。LastUpdate
编辑:
显示GetHashCode()
代码。