LINQ OrderBy z więcej niż jednym polem

83

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.
brainimus
źródło

Odpowiedzi:

171

Musisz użyć ThenBy:

listOfPeople.OrderBy(person => person.LastName)
            .ThenBy(person => person.FirstName)
tzaman
źródło
1
Pełne wyjaśnienie znajduje się tutaj: weblogs.asp.net/zeeshanhirani/archive/2008/04/16/ ...
DigitalNomad
To jest Lambda .. Rozwiązanie LINQ wymaga, aby @svick miało to w LINQ.
Ravi Ram
5
Nie jestem pewny co masz na myśli. Składnia zapytania to tylko cukier dla powyższej składni metody; oba są „LINQ”. Zobacz msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx A jeśli czytasz pytanie, pyta on konkretnie o wersję składni metody.
tzaman
25

Jeśli chcesz użyć składni metody, użyj ThenBy(), jak sugerowali inni:

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

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()i ThenBy(), 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ą dla IEnumerable<T>wewnętrznych wywołań OrderBy()i ThenBy().

svick
źródło
3

Kolejne pola należy uporządkować za pomocą metody ThenBy ()

Ben Robinson
źródło
2

Posługiwać się .ThenBy(aPerson=>field2);

Robaticus
źródło
2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
moi_meme
źródło
2

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”

daniele3004
źródło