Сортировать список по свойству, а затем по другому - PullRequest
11 голосов
/ 10 марта 2010

У меня есть пример класса, содержащий две точки данных:

public enum Sort { First, Second, Third, Fourth }
public class MyClass
{
    public MyClass(Sort sort, string name) { 
        this.Sort = sort; 
        this.Name = name; 
    }

    public Sort Sort { get; set; }
    public string Name { get; set; }
}

Я хочу отсортировать их по группам по их свойству Sort, а затем расположить их в алфавитном порядке.

List<MyClass> list = new List<MyClass>() { 
    new MyClass(MyClass.Sort.Third, "B"), 
    new MyClass(MyClass.Sort.First, "D"),
    new MyClass(MyClass.Sort.First, "A"),
    new MyClass(MyClass.Sort.Fourth, "C"),
    new MyClass(MyClass.Sort.First, "AB"),
    new MyClass(MyClass.Sort.Second, "Z"),
};

Выход будет тогда: (показывает Name)

A
AB
D
Z
B
C

Я смог сделать это, используя foreach для разделения элементов на множество меньших массивов (сгруппированных по значению enum), но это кажется очень утомительным - и я думаю, что должно быть какое-то решение LINQ, которое я надену не знаю о.

Ответы [ 3 ]

21 голосов
/ 10 марта 2010

Используя методы расширения, сначала OrderBy перечисление, ThenBy имя.

var sorted = list.OrderBy( m => m.Sort ).ThenBy( m => m.Name );
5 голосов
/ 10 марта 2010

Помимо хороших решений LINQ, вы также можете сделать это с помощью метода сравнения, как вы упомянули. Заставьте MyClass реализовать интерфейс IComparable, используя метод CompareTo, например:

  public int CompareTo(object obj)
  {
      MyClass other = (MyClass)obj;
      int sort = this.srt.CompareTo(other.srt);
      return (sort == 0) ? this.Name.CompareTo(other.Name) : sort;
  }

Приведенный выше метод упорядочит ваши объекты сначала по перечислению, и, если значения перечисления равны, он сравнивает имя. Затем просто позвоните list.Sort() и он выведет правильный порядок.

4 голосов
/ 10 марта 2010

Это должно сделать это, я думаю

var result = from m in list
             orderby m.Sort, m.Name
             select m;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...