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).
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.
Vous devez utiliser ThenBy
:
listOfPeople.OrderBy(person => person.LastName)
.ThenBy(person => person.FirstName)
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()
.
Vos champs suivants doivent être classés en utilisant la méthode ThenBy ()
Utilisez .ThenBy(aPerson=>field2);
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
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"