2010-03-10 6 views
11

J'ai un exemple de classe contenant deux points de données:Trier une liste par une propriété, puis par un autre

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

Je cherche à les classer en groupes par leurs biens Sort, puis alphabétiser ces groupes.

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

La sortie serait alors: (affichage Name)

A 
AB 
D 
Z 
B 
C 

Je suis en mesure de le faire en utilisant un foreach pour séparer les éléments en plusieurs tableaux plus petits (regroupés par le ENUM valeur) mais cela semble très fastidieux - et je pense qu'il doit y avoir une solution LINQ que je ne connais pas.

Répondre

20

En utilisant les méthodes d'extension, d'abord OrderBy l'enum, ThenBy nom.

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

Cela devrait le faire, je pense que

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

Cette syntaxe n'est pas valide. Le 'select m' doit être placé à la fin, alors ce sera correct. –

+0

Merci Ahmed, corrigé. 3h échouer – pdr

5

Mis à part les belles solutions de LINQ, vous pouvez aussi le faire avec une méthode comparer comme vous l'avez mentionné. Faites MyClass implémenter l'interface IComparable, avec une méthode CompareTo comme:

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

La méthode ci-dessus commander vos objets d'abord par le ENUM, et si les valeurs ENUM sont égales, il compare le nom. Ensuite, appelez simplement list.Sort() et il affichera l'ordre correct.

Questions connexes