LINQ OrderBy з кількома полями


83

У мене є список, який мені потрібно відсортувати за двома полями. Я намагався використовувати OrderBy у LINQ, але це дозволяє мені вказати лише одне поле. Я шукаю список для сортування за першим полем, а потім, якщо в першому полі є дублікати, для сортування за другим полем.

Наприклад, я хочу, щоб результати виглядали так (відсортовані за прізвищем, а потім за іменем).

  • Адамс, Джон
  • Сміт, Джеймс
  • Сміт, Пітер
  • Томпсон, Фред

Я бачив, що для цього ви можете використовувати синтаксис, подібний до SQL, але я шукаю спосіб зробити це за допомогою методу OrderBy.

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

Відповіді:


171

Вам потрібно використовувати ThenBy:

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

1
Повне пояснення наведено тут: weblogs.asp.net/zeeshanhirani/archive/2008/04/16/…
DigitalNomad

Це Лямбда .. Рішення LINQ потрібно @svick має його в LINQ.
Раві Рам

5
Я не впевнений, що ви маєте на увазі. Синтаксис запиту - це лише цукор для наведеного вище синтаксису методу; обидва - "LINQ". Див. Msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx. І якщо ви прочитаєте питання, він спеціально просить версію синтаксису методу.
tzaman

25

Якщо ви хочете використовувати синтаксис методу, використовуйте ThenBy(), як пропонували інші:

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

У синтаксисі запитів те саме можна виконати майже так, як ви хотіли: два клавіші сортування, розділені комою:

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

Наведений вище код буде фактично скомпільований до коду, який використовує OrderBy()і ThenBy(), як у першому прикладі.

Крім того, якщо ви хочете мати OrderBy()два (або більше) клавіші сортування, ви можете, звичайно, написати це як метод розширення для IEnumerable<T>внутрішнього виклику OrderBy()та ThenBy().




2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);

2

Спосіб замовлення списку з більшою кількістю поданих полягає в наступному:

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

Ви можете додати інші поля за допомогою класолі "ThenBy"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.