为什么不包含调用CompareTo和Equals?

时间:2015-01-19 19:31:06

标签: c# equals compareto

在比较自定义类的实例时,我注意到对Contains的调用并不像我期望的那样工作。假设默认比较是通过引用(指针或其所调用的任何内容)来实现的,我实现了CompareToEquals。当然,我确保正在实施IComparable

当我在这些方法上设置断点时,它仍然没有工作,我没有点击。

如果我没有,我可以错过什么,并且是使用扩展方法的最佳选择?

public override bool Equals(Object input)
{
  return Id == ((MyType) input).Id;
}

public int CompareTo(Object input)
{
  return Id - ((MyType)input).Id;
}

1 个答案:

答案 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 ==