5

重複の可能性:
LINQ 拡張メソッド - Any() vs. Where() vs. Exists()

メモリ内のオブジェクトのリストを指定して、次の 2 つの式を実行しました。

myList.where(x => x.Name == "bla").Any() 

myList.Any(x => x.Name == "bla")

後者は常に最速でした。これは、Where がすべての項目を列挙しているためだと思います。しかし、これは一致がない場合にも発生します。

ただし、正確な理由はわかりません。Nhib をクエリしている場合のように、この表示されたパフォーマンスの違いが当てはまらない場合はありますか?

乾杯。

4

3 に答える 3

10

with 述語はAny()、反復子 ( yield return) なしでそのタスクを実行できます。a を使用するWhere()とイテレータが作成され、パフォーマンスに影響を与えます (非常に小さいですが)。

したがって、パフォーマンスに関しては (少し)、Any()述語 ( x => x.Name == "bla") を取る の形式を使用する方が適切です。個人的にはどちらの方が読みやすいと思います...

補足として、Where()必ずしもすべての要素を列挙するわけではありません。要求されたときに要素を移動するイテレータを作成するだけAny()ですWhere()。条件に一致します。

したがって、パフォーマンスの違いは、すべてのアイテムを (linq-to-objects で)反復処理することではありません。実際にはその必要がないためです (もちろん、それを満たすものが見つからない場合を除きます) 。要素をウォークオーバーするイテレータを設定しますが、述語ではそうではありません。Where()Where()Any()

于 2012-05-29T13:54:19.440 に答える
2

whereと を修正するWhereと仮定すると=、 「述語付き」バージョンの実行がわずかに速くなる==と思います。ただし、違いが大きい状況はごくわずかであると予想されるため、最初に読みやすさを目指す必要があります。Any

たまたま、私は通常Any、読みやすさの点でも「述語付き」バージョンを好むので、両方の面で勝ちますが、最初に読みやすいと思うものを実際に使用する必要があります。実際に関心のあるシナリオでパフォーマンスを測定し、コードのセクションが必要に応じて実行されていない場合は、マイクロ最適化を検討してください。もちろん、すべてのステップで測定します。

于 2012-05-29T13:57:11.630 に答える
0

これは、Where がすべてのアイテムを列挙しているためだと思います。

がメモリ内のコレクションである場合myList、そうではありません。このWhereメソッドは遅延実行を使用するため、結果を決定するために必要な数のアイテムのみを列挙します。.Any(...)その場合、 と の間に大きな違いは見られません.Where(...).Any()

Nhib をクエリしている場合のように、この表示されたパフォーマンスの違いが当てはまらない場合はありますか?

はい、myListメソッドによって生成された式を取得し、他の場所で実行するクエリに変換するデータ ソース (LINQ To SQL など) の場合、違いが見られる場合があります。式を変換するコードは、式の 1 つをより適切に変換します。

于 2012-05-29T13:59:58.317 に答える