为什么SortedSet <t>默认忽略CompareTo()值为0?

时间:2016-02-19 18:07:14

标签: c# .net clr

当我尝试将AddRange添加到SortedSet时,当它们的compareto结果为零时,它不会添加值。这对我没有任何意义,因为它不是compareTo比较的值的SortedSet,它是T的SortedSet。我试图理解为什么Microsoft会像这样实现它。

  1. 这有什么合理的解释可以帮助我记住将来吗?
  2. 是否通过不从CompareTo返回0来在我的类型上实现IComparable的正确方法?如果我在代码中的其他地方使用IComparable.CompareTo()方法时需要CompareTo来明确地确定相等性会发生什么?

2 个答案:

答案 0 :(得分:0)

比较的重点是说一个项目是否大于,小于或等于另一个项目。集合不允许相等的值 - 并且在排序集合中,相等性定义了相等性。就这么简单。

对于你的第二个问题,听起来你想要进行两种不同的比较 - 一种在某些情况下返回0,而另一种则不然。您可以通过在单独的类中实现IComparer<T>作为单独的比较来实现。请记住,你仍然希望为Compare(x, x)返回0,否则你将永远无法在集合中找到任何东西而不是迭代它...

答案 1 :(得分:0)

它会使SortedSet成为非确定性的

SortedSet

  

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

如果允许关系,则会有任意顺序。这就像字典中的重复键一样。

如果你想要一组T,其中一些从比较返回0,那么SortSet不是正确的集合。

我觉得这有点像XY problem。你想解决什么?