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つのオブジェクトに対して単一の複合比較を構築し、シーケンスを並べ替えることができます。一度その複合比較を使用します。それがほぼ間違いなくあなたが望んでいることです。