Вы должны определенно использовать ThenBy
, а не несколько OrderBy
звонки. (Я предполагаю, что один из фрагментов в вашем вопросе должен был использовать ThenBy
На момент написания этой статьи, два сниппеты идентичны.).
Я хотел бы предложить следующее:
tmp = invoices.InvoiceCollection
.OrderBy(o => o.InvoiceOwner.LastName)
.ThenBy(o => o.InvoiceOwner.FirstName)
.ThenBy(o => o.InvoiceID);
Обратите внимание, как вы можете используйте одно и то же имя каждый раз. Это также эквивалентно:
tmp = from o in invoices.InvoiceCollection
orderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceID
select o;
Если вы звоните OrderBy
несколько раз, это будет эффективно реорганизовать последовательность полностью три раза ... поэтому окончательный вызов будет эффективно доминирующим. Вы можете (в LINQ к объектам) написать
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
+1 для «Это также эквивалентно той части, которую я искал. –
Обратите внимание, что в синтаксисе запроса ключевое слово для заказа - фактически orderby, а не порядок. (_sorry for the pedantry - просто хотел сказать, что однажды исправил сообщение Jon Skeet post_) – fostandy