c # List <T>Сортировка: по китайским штрихам - PullRequest
7 голосов
/ 21 ноября 2011

У меня есть веб-страница, на которой есть сортировка, в которой я должен упорядочить список китайскими штрихами.

Я создал приложение, содержащее такой код:

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();

но есть ошибка: At least one object must implement IComparable.

Что это значит и как я могу это исправить?

Ответы [ 4 ]

8 голосов
/ 21 ноября 2011

Вам необходимо, чтобы ваш класс 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 голосов
/ 21 ноября 2011

Вместо реализации IComparable, почему бы просто не использовать немного LINQ?

stuList.OrderBy( s => s.Name ) //.ToList if you really want a List
3 голосов
/ 21 ноября 2011

Student должен реализовать IComparable.

0 голосов
/ 21 ноября 2011
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
}
...