LINQ OrderBy versus ThenBy Ask Question

LINQ OrderBy versus ThenBy Ask Question

Can anyone explain what the difference is between:

tmp = invoices.InvoiceCollection
              .OrderBy(sort1 => sort1.InvoiceOwner.LastName)
              .OrderBy(sort2 => sort2.InvoiceOwner.FirstName)
              .OrderBy(sort3 => sort3.InvoiceID);

and

tmp = invoices.InvoiceCollection
              .OrderBy(sort1 => sort1.InvoiceOwner.LastName)
              .ThenBy(sort2 => sort2.InvoiceOwner.FirstName)
              .ThenBy(sort3 => sort3.InvoiceID);

Which is the correct approach if I wish to order by 3 items of data?

ベストアンサー1

You should definitely use ThenBy rather than multiple OrderBy calls.

I would suggest this:

tmp = invoices.InvoiceCollection
              .OrderBy(o => o.InvoiceOwner.LastName)
              .ThenBy(o => o.InvoiceOwner.FirstName)
              .ThenBy(o => o.InvoiceID);

Note how you can use the same name each time. This is also equivalent to:

tmp = from o in invoices.InvoiceCollection
      orderby o.InvoiceOwner.LastName,
              o.InvoiceOwner.FirstName,
              o.InvoiceID
      select o;

If you call OrderBy multiple times, it will effectively reorder the sequence completely three times... so the final call will effectively be the dominant one. You can (in LINQ to Objects) write

foo.OrderBy(x).OrderBy(y).OrderBy(z)

which would be equivalent to

foo.OrderBy(z).ThenBy(y).ThenBy(x)

ソート順は安定していますが、絶対にそうすべきではありません:

  • 読みにくい
  • パフォーマンスが良くない(シーケンス全体を並べ替えるため)
  • それはおそらくない他のプロバイダ(LINQ to SQLなど)でも動作する
  • 基本的に、これはOrderBy設計された使用方法ではありません。

のポイントは、OrderBy「最も重要な」順序付け投影を提供することです。その後、 をThenBy(繰り返し) を使用して、2 次、3 次などの順序付け投影を指定します。

事実上、このように考えてください。OrderBy(...).ThenBy(...).ThenBy(...)任意の2つのオブジェクトに対して単一の複合比較を構築し、シーケンスを並べ替えることができます。一度その複合比較を使用します。それがほぼ間違いなくあなたが望んでいることです。

おすすめ記事