谁能解释一下两者之间的区别:
tmp = invoices.InvoiceCollection
.OrderBy(sort1 => sort1.InvoiceOwner.LastName)
.OrderBy(sort2 => sort2.InvoiceOwner.FirstName)
.OrderBy(sort3 => sort3.InvoiceID);
和
tmp = invoices.InvoiceCollection
.OrderBy(sort1 => sort1.InvoiceOwner.LastName)
.ThenBy(sort2 => sort2.InvoiceOwner.FirstName)
.ThenBy(sort3 => sort3.InvoiceID);
如果我想按 3 项数据排序,哪种方法是正确的?
最佳答案
您绝对应该使用ThenBy
而不是多个OrderBy
来电。
我建议这样做:
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 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(...)
允许您为任意两个对象构建单个复合比较,然后使用该复合比较对序列进行一次排序。这几乎肯定是您想要的。
关于LINQ OrderBy 和 ThenBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3760001/