web-dev-qa-db-fra.com

LINQ OrderBy avec plusieurs champs

J'ai une liste dont j'ai besoin, triée par deux champs. J'ai essayé d'utiliser OrderBy dans LINQ mais cela ne me permet de spécifier qu'un seul champ. Je cherche la liste à trier par le premier champ, puis s'il y a des doublons dans le premier champ à trier par le deuxième champ.

Par exemple, je veux que les résultats ressemblent à ceci (triés par nom de famille, puis prénom).

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

J'ai vu que vous pouvez utiliser le SQL comme la syntaxe pour accomplir cela } mais je cherche un moyen de le faire avec la méthode OrderBy.

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

Vous devez utiliser ThenBy :

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

Si vous souhaitez utiliser la syntaxe de la méthode, utilisez ThenBy() , comme d'autres l'ont suggéré:

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

Dans la syntaxe de requête, la même chose peut être accomplie à peu près comme vous le souhaitiez: deux clés de tri séparées par une virgule:

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

Le code ci-dessus sera réellement compilé en un code qui utilise OrderBy() et ThenBy(), comme dans le premier exemple.

De plus, si vous souhaitez que OrderBy() prenne deux (ou plus) clés de tri, vous pouvez certainement l'écrire comme méthode d'extension sur IEnumerable<T> qui appelle en interne OrderBy() et ThenBy().

22
svick

Vos champs suivants doivent être classés en utilisant la méthode ThenBy ()

2
Ben Robinson

Utilisez .ThenBy(aPerson=>field2);

1
Robaticus
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
1
moi_meme

La façon de commander une liste avec plus de fichiers est la suivante:

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

Vous pouvez ajouter d'autres champs avec clasole "ThenBy"

0
daniele3004