C# 为什么SortedSet<;T>;默认情况下是否忽略0的CompareTo()值?

C# 为什么SortedSet<;T>;默认情况下是否忽略0的CompareTo()值?,c#,.net,clr,C#,.net,Clr,当我尝试向SortedSet添加Range时,当它们的compareto结果为零时,它不会添加值。这对我来说没有任何意义,因为它不是compareTo正在比较的值的分类集,而是t的分类集。我试图理解微软为什么会这样实现它 有没有什么合乎逻辑的解释可以帮助我将来记住 在我的类型上实现IComparable的正确方法是不从CompareTo返回0吗?当我在代码的其他地方使用它的IComparable.CompareTo()方法时,如果我需要CompareTo显式地确定相等性,会发生什么情况 比较的全

当我尝试向SortedSet添加Range时,当它们的compareto结果为零时,它不会添加值。这对我来说没有任何意义,因为它不是compareTo正在比较的值的分类集,而是t的分类集。我试图理解微软为什么会这样实现它

  • 有没有什么合乎逻辑的解释可以帮助我将来记住
  • 在我的类型上实现IComparable的正确方法是不从CompareTo返回0吗?当我在代码的其他地方使用它的IComparable.CompareTo()方法时,如果我需要CompareTo显式地确定相等性,会发生什么情况

  • 比较的全部要点是说明一个项目是否大于、小于或等于另一个项目。一个集合不允许相等的值——在一个排序的集合中,相等是通过比较来定义的。就这么简单


    对于第二个问题,听起来您需要进行两个不同的比较——一个在某些情况下返回0,而另一个则不会。您可以通过在一个单独的类中实现
    IComparer
    ,作为单独的比较。请记住,对于
    Compare(x,x)
    ,您仍然希望返回0,例如,否则您将无法在集合中找到任何内容,除非对其进行迭代…

    这将使SortedSet变得不确定

    表示按排序顺序维护的对象集合

    如果允许联系,就会有任意命令。这就像字典中的重复键

    如果您想要一组T,其中一些T从compare to返回0,那么SortSet不是正确的集合


    我有种感觉,这有点不对劲。你想解决什么问题

    我已经回答了你的第一个问题——我根本不明白你说的第二个问题是什么意思;非常非常不清楚,我更新了。希望现在更清楚了。嗯,也许吧。我会编辑我的答案,你可以看到你想要做什么……有两种不同的比较——一种是由
    Object.Equals
    IEqualityComparer.Equals实现的,另一种是由
    IComparable.CompareTo
    icomparaer.Compare>实现的,有时,他们集体报告两个项目彼此无序,但并不相等,这可能是有道理的。这种行为可能是有意义的,例如
    十进制
    值为12.3m和12.30m;两者都不大于另一个,但可以提出一个强有力的论据,即它们的
    Equals
    方法应将它们报告为不同的(例如,如果要使用..
    字典
    来缓存字符串表示,值12.3m应映射到字符串“12.3”,12.30m应映射到字符串“12.30”)。我相信Java的
    BigDecimal
    类型对于
    equals
    compareTo
    有着不同的行为,本质上就是因为这个原因。