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().

Свик
источник
3

Ваши последующие поля должны быть упорядочены с помощью метода ThenBy ()

Бен Робинсон
источник
2

Использовать .ThenBy(aPerson=>field2);

Робатикус
источник
2
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
moi_meme
источник
2

Чтобы заказать список с большим количеством полей, выполните следующие действия:

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

Вы можете добавить другие поля с классом ThenBy

daniele3004
источник