C # List <> Порядок с 3 свойствами .Net 2.0 - PullRequest
7 голосов
/ 09 июня 2009

Скажем, у меня есть класс Person со свойствами Name, Age, Level.

Я знаю, как заказать по одному из свойств, с

        PersonList.Sort(delegate(Person p1, Person p2) {
            return p1.Name.CompareTo(p2.Name);
        });

Но как я могу заказать по имени, возрасту и уровню.

Эквивалент SQL-предложения: ORDER BY Имя, Возраст, Уровень

Спасибо

Ответы [ 8 ]

28 голосов
/ 09 июня 2009

Адаптация вашего текущего кода:

PersonList.Sort(delegate(Person p1, Person p2) {
        int r = p1.Name.CompareTo(p2.Name);
        if (r == 0) r = p1.Age.CompareTo(p2.Age);
        if (r == 0) r = p1.Level.CompareTo(p2.Level);
        return r;
    });

или простое решение linq-ish:

PersonList = PersonList.OrderBy(p => p.Name)
                       .ThenBy(p => p.Age)
                       .ThenBy(p => p.Level).ToList();
4 голосов
/ 09 июня 2009

Рассматривали ли вы переход на .NET 3.5 и использование LINQ? В LINQ такие вещи действительно просты:

personList = personList.OrderBy(p => p.Name).
    ThenBy(p => p.Age).ThenBy(p => p.Level).ToList();
2 голосов
/ 09 июня 2009

Я бы включил IComparable в ваш класс Person. В вашем пользовательском методе сравнения вы можете настроить логику для сравнения по всем трем свойствам и убедиться, что у них есть правильный «вес» (например, если два экземпляра Person имеют одно и то же имя, следует сортировать их по возрасту или уровню) ).

1 голос
/ 09 июня 2009

Если вы используете .NET 3.5

 IQueryable<Person> people = PersonList.AsQueryable();

 return people.OrderBy(x => x.Name).ThenBy(x => x.Age).ThenBy(x => x.level);
0 голосов
/ 09 июня 2009
var result = from p in persons
             orderby p.Name, p.Age, p.Level
             select p;
0 голосов
/ 09 июня 2009

Вам необходимо вызвать CompareTo для первого свойства, по которому вы хотите упорядочить, получить возвращаемое значение, а если оно равно 0, то вызвать CompareTo для следующего свойства и повторять, каждый раз, когда возвращается 0, переходить к следующее свойство до тех пор, пока вы не получите ненулевое значение (которое вы затем возвращаете) или пока не дойдете до конца свойств, по которым вы хотите отсортировать.

0 голосов
/ 09 июня 2009

Рассматривали ли вы LINQ to Objects?

var x = (from p in PersonList
        orderby p.Name, p.Age, p.Level
        select p).ToList();
0 голосов
/ 09 июня 2009

Если у вас есть C # 3.0 (поддержка LINQ), вы можете сделать следующее:

var result = (from p in PersonList
              orderby p.Name, p.Age, p.Level
              select p).ToList();
...