LINQ OrderBy与ThenBy

Daz*_*Cat 118 linq

任何人都可以解释之间的区别:

tmp = invoices.InvoiceCollection
              .OrderBy(sort1 => sort1.InvoiceOwner.LastName)
              .OrderBy(sort2 => sort2.InvoiceOwner.FirstName)
              .OrderBy(sort3 => sort3.InvoiceID);
Run Code Online (Sandbox Code Playgroud)

tmp = invoices.InvoiceCollection
              .OrderBy(sort1 => sort1.InvoiceOwner.LastName)
              .ThenBy(sort2 => sort2.InvoiceOwner.FirstName)
              .ThenBy(sort3 => sort3.InvoiceID);
Run Code Online (Sandbox Code Playgroud)

如果我想按3项数据订购,哪种方法是正确的?

Jon*_*eet 204

绝对应该使用ThenBy而不是多次OrderBy调用.(我假设您的问题中的一个片段是打算使用的ThenBy.在撰写本文时,两个片段是相同的.)

我建议这样:

tmp = invoices.InvoiceCollection
              .OrderBy(o => o.InvoiceOwner.LastName)
              .ThenBy(o => o.InvoiceOwner.FirstName)
              .ThenBy(o => o.InvoiceID);
Run Code Online (Sandbox Code Playgroud)

请注意每次如何使用相同的名称.这也相当于:

tmp = from o in invoices.InvoiceCollection
      orderby o.InvoiceOwner.LastName,
              o.InvoiceOwner.FirstName,
              o.InvoiceID
      select o;
Run Code Online (Sandbox Code Playgroud)

如果调用OrderBy多次,这将有效地重新排列顺序完全 三次...所以最后调用将有效地占主导地位.你可以(在LINQ to Objects中)编写

foo.OrderBy(x).OrderBy(y).OrderBy(z)
Run Code Online (Sandbox Code Playgroud)

这相当于

foo.OrderBy(z).ThenBy(y).ThenBy(x)
Run Code Online (Sandbox Code Playgroud)

因为排序顺序是稳定的,但你绝对不应该:

  • 这很难读
  • 它表现不佳(因为它重新排序整个序列)
  • 它很可能不会在其他供应商合作(如LINQ to SQL中)
  • 它基本上不是如何OrderBy设计使用.

重点OrderBy是提供"最重要"的排序预测; 然后使用ThenBy(重复)指定二级,三级等排序预测.

实际上,可以这样考虑:OrderBy(...).ThenBy(...).ThenBy(...)允许您为任何两个对象构建单个复合比较,然后使用该复合比较对序列进行一次排序.这几乎可以肯定你想要的.

  • 请注意,在查询语法中,排序的关键字实际上是orderby,而不是order by.(对于迂腐的人来说 - 只是想说我曾经纠正了Jon Skeet的帖子_) (14认同)
  • 这就是我的想法,但由于某种原因,OrderBy,ThenBy,ThenBy似乎没有正确排序所以我想知道我是否正确使用它. (2认同)