IComparable vs Equals()混淆使用哪一个

时间:2018-12-11 06:00:16

标签: c# generics interface compare

我有一个实现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;
}

我真的很困惑这里哪种正确的设计方法。它们实际上服务于不同的目的,哪个是正确的选择?

3 个答案:

答案 0 :(得分:1)

Equals(或IEquatable)用于测试平等IComparable用于测试大于,小于或等于

在某些情况下,测试相等性是有意义的,但没有直观的比较方法。例如,在国际象棋游戏中的ChessPiece类。

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

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

您仍然在这里测试是否相等,而没有实际比较对象。如果您可以编写一种不会破坏这些rules的正确CompareTo方法,那么IComparable是一个有效的选择。

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

  

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

所以Equals在这里更合适。

答案 1 :(得分:0)

IComparable接口

  

定义一个通用的特定类型比较方法,该方法将一个值   类型或类实现以排序或排序其实例

IEquatable接口

  

定义值类型或类实现的通用方法   创建用于确定实例是否相等的类型特定方法

https://docs.microsoft.com/en-us/dotnet/api/system.icomparable?view=netframework-4.7.2 https://docs.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=netframework-4.7.2

答案 2 :(得分:0)

Comparable通常用于可以订购的东西。

当您要检查是否相等时使用“等于”。

如果您想订购,那么可比较的方法是使用等号接口

但是,如果您要实现可比性,那么请确保equals接口与其保持一致。