1

我正在使用 IComparable 和 IComparer

在学生类中:[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 类中对名称进行排序?

4

3 回答 3

5

我正在使用 IComparable 和 IComparer

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

IComparable<T>实现一个对象和另一个对象之间的自然比较。在类似的情况下Student,这可能没有意义,因为有多种方法可以比较学生。另一方面,对于类似的事情来说,DateTime这是完全合理的。

IComparer<T>旨在进行自定义比较-例如,通过比较名称StudentNameComparer来实现 which是有意义的。IComparer<Student>

于 2013-06-20T18:34:46.280 回答
2

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

于 2013-06-20T18:34:29.300 回答
0

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

可以在MSDN 文档站点找到更多信息

当你不写 a 时你得到错误的原因CompareTo是因为如果你没有一个,你的类实际上不会实现IComparable

于 2013-06-20T18:35:07.003 回答