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

Это Lambda .. Решение 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.