2010-03-10 12 views
11

tengo una clase de ejemplo que contiene dos puntos de datos:clasificar una lista por una propiedad y luego por otro

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

Busco a clasificarlos en grupos por sus propiedades Sort, y luego alfabéticamente esos grupos.

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 salida sería entonces: (mostrando Name)

A 
AB 
D 
Z 
B 
C 

he sido capaz de hacer esto mediante el uso de un foreach para separar los elementos en muchas matrices más pequeñas (agrupados por la enumeración valor) pero esto parece muy tedioso, y creo que debe haber alguna solución LINQ que yo no sepa.

Respuesta

20

Usando métodos de extensión, primero OrderBy el nombre enum, ThenBy.

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

Esto debería hacerlo, creo

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

Esta sintaxis no es válida. El 'select m' debe colocarse al final, luego será correcto. –

+0

Gracias Ahmed, corregido. 3am falla – pdr

5

Aparte de las buenas soluciones de LINQ, también se puede hacer esto con un método de comparación de como usted ha mencionado. Haga MyClass implementar la interfaz IComparable, con un método como 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; 
    } 

El método anterior se pida sus objetos por primera vez por la enumeración, y si los valores de enumeración son iguales, se compara el nombre. Luego, simplemente llame al list.Sort() y obtendrá el orden correcto.

Cuestiones relacionadas