2010-03-10 10 views
11

Mam klasę przykład zawierającej dwa punkty danych:posortować listę według właściwości, a następnie przez innego

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; } 
} 

szukam uporządkować je na grupy według ich Sort nieruchomości, a następnie alfabetycznie tych grup.

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"), 
}; 

Wyjście będzie wówczas: (widocznych Name)

A 
AB 
D 
Z 
B 
C 

Byłem w stanie to zrobić za pomocą foreach oddzielić elementy do wielu mniejszych tablic (pogrupowane według wyliczenia wartość), ale wydaje się to bardzo uciążliwe - i myślę, że musi istnieć jakieś rozwiązanie LINQ, o którym nie wiem.

Odpowiedz

20

Korzystanie z metod rozszerzenia, najpierw OrderBy nazwa użytkownika, ThenBy.

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

To powinno wystarczyć, myślę

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

Ta składnia jest nieprawidłowa. "Wybierz m" musi być umieszczone na końcu, wtedy będzie to poprawne. –

+0

Dzięki Ahmed, poprawione. 3 rano nie – pdr

5

Oprócz przyjemnych rozwiązań LINQ, można też zrobić to z metody porównywania jak wspomniałeś. Dokonaj MyClass implementować interfejs IComparable, z CompareTo metoda jak:

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; 
    } 

powyższa metoda będzie zamówić obiektów najpierw wyliczenia, a jeśli wartości wyliczeniowe są równe, porównuje tę nazwę. Następnie wystarczy zadzwonić pod numer list.Sort(), a wyświetli się poprawna kolejność.

Powiązane problemy