Ответ 1
Вам нужно использовать ThenBy
:
listOfPeople.OrderBy(person => person.LastName)
.ThenBy(person => person.FirstName)
У меня есть список, который мне нужно отсортировать по двум полям. Я попытался использовать 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.
Вам нужно использовать ThenBy
:
listOfPeople.OrderBy(person => person.LastName)
.ThenBy(person => person.FirstName)
Если вы хотите использовать синтаксис метода, используйте 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()
.
Ваши последующие поля должны быть упорядочены с помощью метода ThenBy()
Используйте .ThenBy(aPerson=>field2);
var sortedListOfPeople = listOfPeople.OrderBy(aPerson => aPerson.LastName).ThenBy(a => aPerson.FirstName);
Порядок упорядочивания списка с большей подачей состоит в следующем:
var soterdList = initialList.OrderBy(x => x.Priority).
ThenBy(x => x.ArrivalDate).
ThenBy(x => x.ShipDate);
Вы можете добавить другие поля с clasole "ThenBy"