2010-03-10 14 views
11

Ho una classe di esempio che contiene due punti di dati:ordinare un elenco da una proprietà e poi da un altro

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

Sto cercando di ordinarli in gruppi per le loro proprietà Sort, e quindi alfabetizzare quei gruppi.

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

L'uscita sarebbe allora: (mostrando Name)

A 
AB 
D 
Z 
B 
C 

Sono stato in grado di farlo utilizzando un foreach per separare gli articoli in tanti piccoli array (diviso per l'enumerazione valore) ma questo sembra molto noioso - e penso che ci sia una soluzione LINQ che non conosco.

risposta

20

Utilizzo dei metodi di estensione, primo OrderBy enum, ThenBy nome.

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

Questo dovrebbe farlo, penso che

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

Questa sintassi non è valida. Il 'select m' deve essere posizionato alla fine, quindi sarà corretto. –

+0

Grazie Ahmed, corretto. 3am fallire – pdr

5

A parte le belle soluzioni LINQ, si può anche fare questo con un metodo di confronto, come lei ha ricordato. Fare MyClass implementare l'interfaccia IComparable, con un metodo come 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; 
    } 

Il metodo di cui sopra ordinerà gli oggetti in primo luogo dalla enum, e se i valori enum sono uguali, si confronta il nome. Quindi, chiama lo list.Sort() e verrà visualizzato l'ordine corretto.

Problemi correlati