【问题标题】:What does CompareTo() do? IComparableCompareTo() 有什么作用?可比的
【发布时间】:2013-06-21 02:42:48
【问题描述】:

我正在使用 IComparable 和 IComparer

在 Student 类中:[IComparable]

    public int CompareTo(Student studentToCompare)
    {
        if (this.Number < studentToCompare.Number)
            return 1;
        else if (this.Number > studentToCompare.Number)
            return -1;
        else
            return 0;
    }

在 StudentCompareName 类中:[IComparer]

    public int Compare(Student x, Student y)
    {
        return string.Compare(x.Name, y.Name);
    }

使用 Compare(Student x, Student y) 我正在按姓名对学生列表进行排序。

如果我不在 Student-class 中使用 CompareTo(),就会出错。

我想知道为什么我需要在我的主(学生)类中有一个 CompareTo(),它有什么作用?为什么我需要先比较 Student 类中的学号,然后才允许我在 StudentCompareName 类中对名称进行排序?

【问题讨论】:

  • 你能更彻底地定义“我遇到错误”吗?

标签: c# icomparable


【解决方案1】:

我正在使用 IComparable 和 IComparer

这就是混乱的根源。您只需要两者中的一个 - 而且它们很少在同一个类中实现。

IComparable&lt;T&gt; 的实现是为了在一个对象和另一个对象之间进行自然比较。对于Student 之类的情况,这可能没有意义,因为有多种方法可以比较学生。另一方面,对于像DateTime 这样的东西,它是完全合理的。

IComparer&lt;T&gt; 旨在进行自定义比较 - 例如,有一个 StudentNameComparer 通过比较名称来实现 IComparer&lt;Student&gt; 是有意义的。

【讨论】:

  • 这样说有意义吗:IComparable&lt;T&gt; 可用于将一个实例与另一个实例进行比较,而用于自定义比较的IComparer&lt;T&gt; 可用于StudentNameComparer,它需要两个实例和比较他们。这样可以吗?
  • @DarthVader: 不 - StudentNameComparer 不会使用 IComparer&lt;T&gt;,它会 IComparer&lt;T&gt;。它会被Sort之类的东西使用
  • 这就是我的意思,明白了。同时,你能用这个建议吗:stackoverflow.com/questions/17221430/…
  • 我使用了一个 IComparer 并创建了它的一个实例。 StudentNameComparer snc = 新的 StudentNameComparer()。之后我做了 listStudents.Sort(snc)。这样好吗?它有效..
  • @xVizzi:是的,没关系。
【解决方案2】:

IComparable 是一个interface,这意味着它定义了必须在您的继承类中实现的方法。这只是您对对象的“比较”含义的实现。

【讨论】:

    【解决方案3】:

    CompareTo 定义您的基础学生是“大于”、“小于”还是“等于”您的studentToCompare,您可以使用任何您喜欢的标准来定义这些。

    更多信息请访问MSDN documentation site

    当您没有编写CompareTo 时出现错误的原因是,如果您没有编写,您的类实际上不会实现IComparable

    【讨论】:

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