在比较自定义类的实例时,我注意到对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;
}
答案 0 :(得分:2)
更好的实施可能是:
public bool Equals(MyType other)
{
// if 'other' is a null reference, or if 'other' is more derived or less derived
if ((object)other == (object)null || other.GetType() != GetType())
return false;
// OK, check members (assuming 'Id' has a type that makes '==' a wise choice)
return Id == other.Id;
}
public override bool Equals(object obj)
{
// call to other overload
return Equals(obj as MyType);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
在这种情况下,您可以将该类标记为实现IEquatable<MyType>
(但即使没有它,它也能正常工作)。
关于GetHashCode
: 始终 请记得覆盖它。您应该已经看到编译器警告在不覆盖Equals(object)
的情况下覆盖GetHashCode
是有问题的。 从不 将代码return base.GetHashCode()
保留在覆盖中(假设基类为System.Object
)。要么尝试并根据参与Equals
的成员实施某些内容。如果您认为GetHashCode
实际上不会在您的案例中使用,请说:
public override int GetHashCode()
{
throw new NotSupportedException("We don't have GetHashCode, sorry");
}
如果您完全知道自己只使用List<>.Contains
,而不是Dictionary<,>
,HashSet<>
而不是Linq的Distinct()
等等,它可以与GetHashCode()
简单地投掷一起使用。
IComparable<MyType>
或List<MyType>
,或者您使用Linq的MyType[]
和OrderBy
,否则不需要 MyType
,或者您使用SortedDictionary<,>
,SortedSet<>
。
这些用途不需要重载operator ==
。