我有一个要过滤重复项的列表。在问这个问题之前,我在StackOverflow上进行了搜索,找到了两个解决方案。使用.Distinct()
和使用HashSet
,但是这些方法都不适合我。我尝试过滤的对象实现了该.Equals
方法,但仍然无法正常工作。
我通过创建500个完全相同的对象并将其放在列表中进行了测试。我希望剩下1个,但所有500个都还在那里。我的对象是否需要实现其他方法才能起作用?
谢谢。
如果您Equals
始终覆盖,也请覆盖GetHashCode
。
当覆盖Equals方法时,覆盖GetHashCode为什么很重要?
这是一个简单的类来演示可能的实现。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;
}
}
如果您的相等性检查需要包含多个属性或一个集合,则这是另一种实现:
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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句