Mam listę, której potrzebuję, posortowaną według dwóch pól. Próbowałem użyć OrderBy w LINQ, ale to pozwala mi określić tylko jedno pole. Szukam listy do posortowania według pierwszego pola, a następnie, jeśli są jakieś duplikaty w pierwszym polu, aby posortować według drugiego pola.
Na przykład chcę, aby wyniki wyglądały tak (posortowane według nazwiska, a następnie imienia).
- Adams, John
- Smith, James
- Smith, Peter
- Thompson, Fred
Widziałem, że można to osiągnąć za pomocą składni podobnej do SQL, ale szukam sposobu, aby to zrobić za pomocą metody OrderBy.
IList<Person> listOfPeople = /*The list is filled somehow.*/
IEnumerable<Person> sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName, aPerson.FirstName); //This doesn't work.
Jeśli chcesz użyć składni metody, użyj
ThenBy()
, jak sugerowali inni:W składni zapytania to samo można osiągnąć tak, jak chciałeś: dwa klucze sortowania oddzielone przecinkiem:
from person in listOfPeople orderby person.LastName, person.FirstName select person
Powyższy kod zostanie faktycznie skompilowany do kodu używającego
OrderBy()
iThenBy()
, tak jak w pierwszym przykładzie.Ponadto, jeśli chcesz mieć
OrderBy()
dwa (lub więcej) klucze sortowania, z pewnością możesz napisać to jako metodę rozszerzającą dlaIEnumerable<T>
wewnętrznych wywołańOrderBy()
iThenBy()
.źródło
Kolejne pola należy uporządkować za pomocą metody ThenBy ()
źródło
Posługiwać się
.ThenBy(aPerson=>field2);
źródło
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
źródło
Sposób uporządkowania listy z większą liczbą jest następujący:
var soterdList = initialList.OrderBy(x => x.Priority). ThenBy(x => x.ArrivalDate). ThenBy(x => x.ShipDate);
Możesz dodać inne pola za pomocą klasy „ThenBy”
źródło