Обратите внимание, как вы можете использовать одно и то же имя каждый раз. Это также эквивалентно:
tmp =from o in invoices.InvoiceCollectionorderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceIDselect o;
Если вы вызовете OrderByнесколько раз, он полностью переупорядочит последовательность три раза ... так что последний вызов будет фактически доминирующим. Вы можете (в LINQ to Objects) написать
foo.OrderBy(x).OrderBy(y).OrderBy(z)
что было бы эквивалентно
foo.OrderBy(z).ThenBy(y).ThenBy(x)
поскольку порядок сортировки стабилен, но вам категорически не следует:
Трудно читать
Он не работает (потому что меняет порядок всей последовательности)
Это может не работать в других поставщиках (например, LINQ to SQL)
По сути, это не так, как OrderByбыло задумано для использования.
Смысл в OrderByтом, чтобы обеспечить «наиболее важную» упорядочивающую проекцию; затем используйте ThenBy(повторно), чтобы указать вторичные, третичные и т. д. упорядочивающие прогнозы.
Фактически, подумайте об этом так: OrderBy(...).ThenBy(...).ThenBy(...)позволяет вам построить одно составное сравнение для любых двух объектов, а затем один раз отсортировать последовательность, используя это составное сравнение. Это почти наверняка то, что вам нужно.
Это то, что я подумал, но по какой-то причине OrderBy, ThenBy, ThenBy, похоже, не сортируются правильно, поэтому я подумал, правильно ли я его использую.
DazManCat
14
Обратите внимание, что в синтаксисе запроса ключевое слово для упорядочивания на самом деле orderby, а не order by. ( извините за педантизм - просто хотел сказать, что однажды исправил сообщение Джона Скита )
fostandy
1
Джон, мне что-то не подходит из раздела, но вам абсолютно не следует (это относится к применению нескольких порядков с использованием синтаксиса linq fluent, поскольку он переводится в ThenBy в локальных запросах): он не работает хорошо (потому что он переупорядочивает всю последовательность) - вы имеете в виду 2-й или 3-й порядок, переупорядочивая всю последовательность? если да, то как он по-прежнему будет преобразован в ThenBy после изменения порядка следования, отбрасывая предыдущий порядок?
Veverke
@Veverke: он меняет порядок всей последовательности, но стабильно, поэтому, если два значения имеют одинаковое значение z, порядок будет зависеть от y, а затем от x.
Джон Скит,
1
@Veverke: по- OrderBy(a).OrderBy(b).OrderBy(c)прежнему использует результат предыдущей сортировки и переупорядочивает все, но сохраняет существующий порядок (из предыдущего шага), в котором два элемента равны при новом сравнении. Представьте, что у нас только что есть OrderBy(a).OrderBy(b). Результаты OrderBy(a)отображаются в aпорядке возрастания , а затем они переупорядочиваются в соответствии с b. В конечном результате, если два значения имеют одинаковое bзначение, они будут упорядочены по aпричине стабильности сортировки - поэтому это эквивалентно OrderBy(b).ThenBy(a).
Джон Скит,
2
Я обнаружил, что это различие раздражает при попытке создавать запросы в общем виде, поэтому я сделал небольшой помощник для создания OrderBy / ThenBy в правильном порядке для любого количества сортировок.
Есть много способов использовать это в зависимости от вашего варианта использования, но если вы, например, передали список столбцов сортировки и направлений в виде строк и логических значений, вы могли бы перебрать их и использовать их в переключателе, например:
Да, вам никогда не следует использовать несколько OrderBy, если вы играете с несколькими клавишами. ThenBy - более безопасная ставка, поскольку она будет действовать после OrderBy.
OrderBy(a).OrderBy(b).OrderBy(c)
прежнему использует результат предыдущей сортировки и переупорядочивает все, но сохраняет существующий порядок (из предыдущего шага), в котором два элемента равны при новом сравнении. Представьте, что у нас только что естьOrderBy(a).OrderBy(b)
. РезультатыOrderBy(a)
отображаются вa
порядке возрастания , а затем они переупорядочиваются в соответствии сb
. В конечном результате, если два значения имеют одинаковоеb
значение, они будут упорядочены поa
причине стабильности сортировки - поэтому это эквивалентноOrderBy(b).ThenBy(a)
.Я обнаружил, что это различие раздражает при попытке создавать запросы в общем виде, поэтому я сделал небольшой помощник для создания OrderBy / ThenBy в правильном порядке для любого количества сортировок.
Есть много способов использовать это в зависимости от вашего варианта использования, но если вы, например, передали список столбцов сортировки и направлений в виде строк и логических значений, вы могли бы перебрать их и использовать их в переключателе, например:
Результат
sortedQuery
сортируется в желаемом порядке, а не повторяется снова и снова, как предупреждает другой ответ.источник
если вы хотите отсортировать более одного поля, выберите ThenBy:
как это
источник
Да, вам никогда не следует использовать несколько OrderBy, если вы играете с несколькими клавишами. ThenBy - более безопасная ставка, поскольку она будет действовать после OrderBy.
источник