【发布时间】:2015-03-17 21:41:56
【问题描述】:
在比较自定义类的实例时,我注意到对Contains 的调用没有按我预期的方式工作。假设默认比较是通过引用(指针或其他名称)进行的,我实现了CompareTo 和Equals。当然,我确保实现IComparable。
它仍然不起作用,当我在这些方法上设置断点时,我没有得到任何命中。
我可能会遗漏什么,如果我没有,使用扩展方法的最佳选择是什么?
public override bool Equals(Object input)
{
return Id == ((MyType) input).Id;
}
public int CompareTo(Object input)
{
return Id - ((MyType)input).Id;
}
【问题讨论】:
-
您可能需要覆盖
GetHashCode(),也可能需要覆盖==。我们在谈论哪个Contains? Linq中的扩展方法? List 中的那个? -
你在哪个班级打电话给
Contains? -
另外,关于覆盖 Equals 的信息。 msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx
-
@AndyJ 如果您的 MyType 类实现 IEquatable,您仍然“必须”覆盖 GetHashCode(),因为大多数查找首先针对实例的哈希码,请参阅 blogs.msdn.com/b/jaredpar/archive/2009/01/15/…。试一试 - override .GetHashcode() { return base.GetHashCode(); } 并在其中放置一个断点,看看它是否被击中。
-
GetHashCode 是一种预先检查事物是否相等而不执行整个比较的方法。具有相同哈希码的两件事应该是相等的。从理论上讲,hashcode 应该是比整个对象更快的比较,但大多数人没有正确实现它。