Подтвердить что ты не робот

LINQ OrderBy с несколькими полями

У меня есть список, который мне нужно отсортировать по двум полям. Я попытался использовать 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.
4b9b3361

Ответ 1

Вам нужно использовать ThenBy:

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

Ответ 2

Если вы хотите использовать синтаксис метода, используйте 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()

Ответ 4

Используйте .ThenBy(aPerson=>field2);

Ответ 5

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

Ответ 6

Порядок упорядочивания списка с большей подачей состоит в следующем:

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

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