2010-03-10 2 views
11

Ich habe ein Beispiel-Klasse, die zwei Datenpunkte:Sortieren einer Liste von einem Objekt und dann von einem anderen

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

Ich suche sie in Gruppen durch ihre Sort Eigenschaft zu sortieren, und dann diese Gruppen alphabetize.

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

Der Ausgang wäre dann: (zeigt Name)

A 
AB 
D 
Z 
B 
C 

Ich habe in der Lage, dies zu tun, um eine foreach unter Verwendung der Elemente in viele kleinere Arrays (gruppiert nach den ENUM zu trennen Wert), aber das scheint sehr mühsam - und ich denke, dass es eine LINQ-Lösung geben muss, von der ich nichts weiß.

Antwort

20

Mit Erweiterungsmethoden, zuerst OrderBy die enum, ThenBy Name.

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

Das sollte es tun, ich denke, von den schönen LINQ Lösungen

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

Diese Syntax ist nicht gültig. Das 'select m' muss am Ende platziert werden, dann ist es korrekt. –

+0

Danke Ahmed, korrigiert. 3 Uhr scheitern – pdr

5

Abgesehen können Sie mit einem Verfahren vergleichen, tun dies auch, wie Sie erwähnt haben. Machen Sie MyClass implementieren die IComparable Schnittstelle, mit einem CompareTo Verfahren wie:

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

das obige Verfahren wird Ihre Objekte zuerst durch die Enum bestellen, und wenn die ENUM-Werte gleich sind, vergleicht er den Namen. Dann rufen Sie einfach list.Sort() und es wird die richtige Reihenfolge ausgeben.