【问题标题】:Effectively disable Sort() within a CompareTo() override?在 CompareTo() 覆盖中有效地禁用 Sort()?
【发布时间】:2010-03-09 23:24:11
【问题描述】:

我的类的CompareTo() 方法是动态的,可以是简单的比较,也可以是多列的比较。这一切都是在运行时确定的,而且效果很好。

但在某些情况下,我希望尝试使用默认比较对我的对象集合进行排序,而不是什么都不做。

CompareTo() 只返回一个 0 进行任何比较,令我惊讶的是,它不起作用。该列表以某种奇怪的、看似随机的顺序重新排列。

CompareTo() 方法实现中有没有办法做到这一点?我宁愿不通过重写 Sort() 在集合级别处理这个问题。

【问题讨论】:

    标签: c# vb.net sorting collections icomparer


    【解决方案1】:

    这是因为 QuickSort 不是 stable sort。除非您能以某种方式获取元素的索引,否则我看不到在 CompareTo 方法中解决此问题的好选择。

    【讨论】:

    • 谢谢,很有意义。我预料会是这样,但数据算法课是很久以前的事了……
    【解决方案2】:

    我还没有证明这一点,但作为一个建议,如果您尝试始终返回 1 或始终返回 -1 会怎样?

    【讨论】:

    • 这违反了 CompareTo 方法的属性:如果 A.CompareTo(B) 返回一个非零值,则 B.CompareTo(A) 需要返回一个相反符号的值。
    【解决方案3】:

    您必须覆盖Sort()Sort() 的默认实现不保证它将如何使用 CompareTo() 到达排序集合,因此没有任何方法可以使用它来使 Sort() 做正确的事情。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多