LINQ OrderBy 和 ThenBy

标签 linq

谁能解释一下两者之间的区别:

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/

相关文章:

javascript - 以数组为参数的 Linq 查询

c# - 默认情况下是否编译了 LINQ to Entities 4.0 查询?

c# - EF Core 7 - 仅包含未删除的项目

c# - 在 For Each 循环中连接字符串

c# - 合并两个 linq 语句并删除重复项

c# - 如何将多个表达式组合成一个快速方法?

c# - 比较可为空的日期时间

c# - 获取 SortedDictionary 的子集作为 SortedDictionary

c# - LINQ:按最常见值的计数排序

c# - 动态构建 LINQ 查询 - 强制使用 sp_executesql 而不是原始查询