【问题标题】:IComparable vs Equals() confused on which one to useIComparable vs Equals() 对使用哪个感到困惑
【发布时间】:2018-12-11 06:00:15
【问题描述】:

我有一个实现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# generics interface compare


    【解决方案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 会更适合这里。

    【讨论】:

    • 是的,我认为需要一个 int 是不寻常的,这让我问 :) 感谢您解决这个问题。
    【解决方案2】:

    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

    【讨论】:

      【解决方案3】:

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

      当你想检查相等时使用Equals。

      如果你想订购,那么可比是要走的路,否则使用 equals 接口

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

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多