C# List<T> 排序:按照汉字笔画排序

7

我有一个网页,其中有一个排序功能,我需要按照汉字笔画来对列表进行排序。

我创建了一个应用程序,其中包含以下代码:

List<Student> stuList = new List<Student>() { 
          new Student("上海"),
           new Student("深圳"),
            new Student("广州"),
             new Student("香港")
            };
        System.Globalization.CultureInfo strokCi = new System.Globalization.CultureInfo("zh-tw");
        System.Threading.Thread.CurrentThread.CurrentCulture = strokCi; ;
        //stuList.sort();

但是出现了一个错误:至少有一个对象必须实现IComparable接口。

这是什么意思,我该如何修复它?

4个回答

7
你需要让你的Student类实现IComparable接口。这需要实现一个CompareTo方法,该方法可以简单地返回在你试图排序的字符串之间调用CompareTo的结果。
例如,如果构造函数初始化了一个name字段,你可能会有这样的代码:
public class Student : IComparable
{
    private string name;

    public Student(string name)
    {
        this.name = name;
    }

    public int CompareTo(object other)
    {
        Student s = other as Student;
        if (s == null)
        {
            throw new ArgumentException("Students can only compare with other Students");
        }

        return this.name.CompareTo(s.name);
    }
}

3

Student 必须实现 IComparable 接口。


3
与其实现 IComparable,为什么不使用一点 LINQ 呢?
stuList.OrderBy( s => s.Name ) //.ToList if you really want a List

如果我使用这个“orderby”,结果不太对。否则,如果表的COLLATE是“SQL_Latin1_General_CP1_CI_AS”,那就不是我想要的。我必须用“Chinese_PRC_Stroke_ci_as”来排序列表。我的英语非常差,可能有些错误,请见谅! - ToddZhao

0
public class Student : IComparable
{
    private string message = null;
    public Student(string message)
    {
        this.message = message;
    }
    #region IComparable Members

    public int CompareTo(object obj)
    {
        // implement your logic, here is a example:
        if (obj != null)
            return message.CompareTo(((Student)obj).message);
        return int.MinValue;
    }

    #endregion
}

如果 obj 为空,为什么要返回 MinValue?这似乎有点奇怪。 - dan-gph
@Dangph: 这意味着所有的学生在“null”之前都应该进行比较,这并不是不合理的。 - Platinum Azure
@Platinum Azure,IComparable的文档中指出,“根据定义,任何对象都比null大”。所以是相反的。另外,为什么要选择MinValue呢?如果我看到这个,我会认为它有特殊的含义,但实际上并没有。 - dan-gph
@Dangph:那不就是一种惯例吗? - Platinum Azure
@Platinum Azure,如果你在谈论比较大于null的对象,我会说这是IComparable规范的一部分,而不仅仅是一个惯例。如果你在谈论MinValue,我会说默认负数的惯例是使用-1。 - dan-gph
@Dangph 谢谢你,Dangph。你说得对。我没有太多考虑给出的例子,只是想返回一个负数。 - user900202

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接