2010-03-10 9 views
11

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

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 для разделения элементов на множество мелких массивов (сгруппировано по перечислимому значение), но это кажется очень утомительным - и я думаю, что должно быть какое-то решение LINQ, о котором я не знаю.

ответ

20

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

var sorted = list.OrderBy(m => m.Sort).ThenBy(m => m.Name); 
4

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

var result = from m in list 
      orderby m.Sort, m.Name 
      select m; 
+0

Этот синтаксис недействителен. 'Select m' нужно разместить в конце, тогда это будет правильно. –

+0

Спасибо, Ахмед, исправлено. Ошибка 3 утра – pdr

5

Помимо хороших решений 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(), и он выведет правильный порядок.

Смежные вопросы