我有一个列表,我想过滤重复的项目。在询问这个问题之前,我在StackOverflow上搜索并找到了两个解决方案;使用.Distinct()
并使用HashSet
,但这些方法都不适用于我。我尝试过滤的对象实现了.Equals
方法,但它仍然不起作用。
我通过创建500个完全相同的对象并将它们放在列表中来测试它。我预计会有1人离开,但所有500人仍在那里。我的对象是否需要实现其他方法才能生效?
感谢。
答案 0 :(得分:8)
如果您覆盖Equals
,请始终覆盖GetHashCode
。
Why is it important to override GetHashCode when Equals method is overridden?
这是一个演示可能实现的简单类。 GetHashCode
应该是有效的,并且应该产生很少的冲突:
public class Foo
{
public int ID { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
Foo other = obj as Foo;
if (other == null) return false;
return this.ID == other.ID;
}
public override int GetHashCode()
{
return ID;
}
}
如果您的等式检查需要包含多个属性或集合,则Here's另一个实现:
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}