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.
brainimus
fuente

Respuestas:

169

Necesitas usar ThenBy:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)
tzaman
fuente
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().

svick
fuente
3

Los campos siguientes deben ordenarse mediante el método ThenBy ()

Ben Robinson
fuente
2

Utilizar .ThenBy(aPerson=>field2);

Robaticus
fuente
2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
moi_meme
fuente
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"

daniele3004
fuente