2010-12-13 5 views
5

he definido un tipo de la siguiente manera:Ordenación de un IEnumerable <type> por tres campos

public class myType 
{ 
    public string firstName { get; set; } 
    public string middleName { get; set; } 
    public string lastName { get; set; } 
} 

I tienen un IEnumerable<myType>.

Quiero usar la extensión .OrderBy() para ordenar mi lista de myType de la siguiente manera.

Los objetos deben estar ordenados por apellido. Donde los apellidos son iguales, deben estar en orden por nombre. Donde los nombres son los mismos, deben estar en orden por el segundo nombre.

¿Cómo puedo hacer esto?

+1

(los miembros tendrá que ser * accesibles * (por lo general: 'public') para ordenarlos, y las propiedades generalmente serían preferibles a los campos) –

Respuesta

17
var qry = items.OrderBy(x => x.lastName).ThenBy(x => x.firstName) 
    .ThenBy(x => x.middleName); 

o en LINQ sintaxis:

var qry = from x in items 
      orderby x.lastName, x.firstName, x.middleName 
      select x; 
+0

+1. Recuerde que el lambda puede ser cualquier código que devuelva una cadena, por lo que podría, por ejemplo. realice una comprobación nula y devuelva un valor predeterminado no nulo. No sé cómo la QuickSort integrada detrás de la mayoría de los clasificadores .NET manejará nulos. Además, aunque OrderBy() afirma ser un tipo estable, si lo hace, entonces no utiliza el clasificador incorporado que también activa List.Sort y Array.Sort, y es inestable. – KeithS

+2

@KeithS: no tiene que devolver una cadena. Puede ser cualquier cosa que devuelva un valor, siempre que los valores se puedan comparar para ordenar más tarde. Y sí, OrderBy realmente * es * estable. –

7
myList.OrderBy(t => t.lastName).ThenBy(t => t.firstName).ThenBy(t => t.middleName) 

Además, cada OrderBy y ThenBy tienen una versión Descending, por lo OrderByDescending y ThenByDescending

Cuestiones relacionadas