У меня есть список, который мне нужно отсортировать по двум полям. Я пробовал использовать 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()
, как предлагали другие:В синтаксисе запроса то же самое можно сделать практически так, как вы хотели: два ключа сортировки, разделенные запятой:
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);
Вы можете добавить другие поля с классом ThenBy
источник