web-dev-qa-db-ja.com

FirstOrDefault / FirstとOrderByDescendingは、LastOrDefault / LastとOrderByよりも高速ですか?

誰かが答えを知っているかどうか疑問に思ったLINQの質問がありました。

通常、「最新の追加者」など、特定のフィールドで並べ替えられたレコードを検索する場合は、次のように記述します。

MyCollection.OrderByDescending(x => x.AddedDate).FirstOrDefault();

最近、私はチーム内の別の開発者からいくつかの作品をピックアップしました。

MyCollection.OrderBy(x => x.AddedDate).LastOrDefault();

だから私の質問はこれです、降順を注文して最初を選択するのは、他の方向を注文して最後を選択するよりも速いですか、遅いですか?

私の考えでは、オブジェクトを返すときにコレクションを「これまで」繰り返す必要がないため、最初の方が速いと思いますが、これは何よりも予感です。

13
dougajmcdonald

LINQ-to-Objectsを使用している場合、最初のオブジェクトはわずかに高速になります。 2つの並べ替えにはそれぞれ同じ時間がかかります*が、FirstOrDefaultLastOrDefaultよりも速いと考えるのは正しいことです。ただし、並べ替えにかかる時間と比較すると、違いはごくわずかです。

(トップアイテムだけを取得するためにソート全体を実行することは、LastよりもFirstを使用するよりもはるかに非効率的であることに注意してください。MoreLINQの MaxBy のようなものを実装することを検討してください。 = O(n)ではなく、O(n log n)で必要なアイテムを取得する関数。)

LINQ-to-something(SQL、エンティティ)を使用している場合は、おそらくまったく違いはありません。

* 一般に; RBが指摘しているように、データがすでにある程度順序付けられている場合は、そうではない可能性があります。

12
Rawling