首页 > 解决方案 > IComparable vs Equals() 对使用哪个感到困惑

问题描述

我有一个实现接口T的类。T

我意识到我不能==在对象上做,所以我Equals()在我的代码中使用了方法:

return (Equals(_nodes[node.QueueIndex] , node));

但经过一番谷歌搜索后,我也找到IComparable了一个选项,所以我也可以这样做:

return node.CompareTo(_nodes[node.QueueIndex]) >= 0;

我的接口在哪里继承IComparable并实现它:

public int CompareTo(object obj)
{
    return obj == this ? 1 : 0;
}

我真的很困惑哪种是正确的设计方法。它们实际上是否有不同的目的,哪一个是正确的选择?

标签: c#genericsinterfacecompare

解决方案


Equals(or IEquatable) 用于测试相等性IComparable用于测试大于、小于或等于

存在测试相等性的情况,但没有直观的方法来比较它们。例如,ChessPiece象棋游戏中的一个类。

我认为IComparable这里不是一个好的选择,因为您实现的方式CompareTo很尴尬:

public int CompareTo(object obj)
{
    return obj == this ? 1 : 0;
}

您仍然只是在这里测试相等性,而不是实际比较对象。如果您可以编写一个CompareTo不违反这些规则的适当方法,那么IComparable是一个有效的选择。

在链接的这些规则中,您CompareTo违反了此规则:

如果A.CompareTo(B)返回一个非零值,则B.CompareTo(A)必须返回一个相反符号的值。

所以Equals会更适合这里。


推荐阅读