1. ホーム
  2. linq

[解決済み] LINQ OrderByとThenByの比較

2022-06-19 16:30:52

質問

どのような違いがあるのでしょうか。

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 を複数回呼び出すと、効果的に配列の順序を入れ替えることができます。 完全に を3回繰り返すと、最後の呼び出しが事実上優勢になります。あなたは (と書くことができます(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(...) を使うと、任意の二つのオブジェクトに対して一つの複合比較を構築し、その結果を並べ替えることができます。 一度 でシーケンスをソートします。これは、ほぼ間違いなくあなたが望むことです。