LINQ OrderBy con más de un campo


82

Tengo una lista que necesito ordenar por dos campos. Intenté usar OrderBy en LINQ pero eso solo me permite especificar un campo. Estoy buscando que la lista se ordene por el primer campo y luego, si hay duplicados en el primer campo, ordenar por el segundo campo.

Por ejemplo, quiero que los resultados se vean así (ordenados por apellido y luego por nombre).

  • Adams, John
  • Smith, James
  • Smith, Peter
  • Thompson, Fred

He visto que puede usar la sintaxis similar a SQL para lograr esto, pero estoy buscando una manera de hacerlo con el método OrderBy.

IList<Person> listOfPeople = /*The list is filled somehow.*/
IEnumerable<Person> sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName, aPerson.FirstName); //This doesn't work.

Respuestas:


169

Necesitas usar ThenBy:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)

1
Aquí se incluye una explicación completa: weblogs.asp.net/zeeshanhirani/archive/2008/04/16/…
DigitalNomad

Esto es Lambda .. La solución LINQ necesita @svick la tiene en LINQ.
Ravi Ram

5
No estoy seguro de lo que quieres decir. La sintaxis de consulta es simplemente azúcar para la sintaxis del método anterior; ambos son "LINQ". Consulte msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx Y si lee la pregunta, está pidiendo específicamente la versión de sintaxis del método.
tzaman

24

Si desea utilizar la sintaxis del método, utilice ThenBy(), como sugirieron otros:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)

En la sintaxis de consulta, se puede lograr lo mismo de la manera que desea: dos claves de clasificación separadas por una coma:

from person in listOfPeople
orderby person.LastName, person.FirstName
select person

El código anterior se compilará en realidad en el código que usa OrderBy()y ThenBy(), como en el primer ejemplo.

Además, si desea que OrderBy()eso requiera dos (o más) claves de clasificación, ciertamente puede escribirlo como un método de extensión en IEnumerable<T>las llamadas internas OrderBy()y ThenBy().




2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);

2

La forma de ordenar una lista con más archivados es la siguiente:

var soterdList = initialList.OrderBy(x => x.Priority).
                                    ThenBy(x => x.ArrivalDate).
                                    ThenBy(x => x.ShipDate);

Puede agregar otros campos con la clase "ThenBy"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.