4

私は持っていList<String> myListます。

このリストで、いくつかの基準に一致する最初の 10 項目を取得したいと考えています (.Contains("a")たとえば、 としましょう)。

私は持っている:

Var results = myList.Where(o=>o.Contains("a")).Take(10);

どちらが正常に機能しますが、LINQ はWhereこの条件を満たすすべてのアイテムを取得するために を実行し、それらの最初の 10 個のみを取得しましたか? それとも、LINQ ステートメント全体が考慮されるようにコンパイルされますか (つまり、Where10 項目に達するまでしか実行されません)。

4

3 に答える 3

4

Where ステートメントは、列挙されるのを待っている IEnumerable を返します。Where ロジックの実行は、IEnumerable に次の値を「尋ねる」まで遅延します。

Take(10) ステートメントはまさにそれを行います - Where 条件の「次の一致」を要求します。これは 10 回実行され、終了します。もちろん、同じ理由で、Take(10) ステートメントのロジックは、最終的な戻り値 (この場合は結果) を列挙するまで実際には実行されません。

はい、それは一種の最適化されていますが、おそらくあなたが想像した方法とはまったく異なります.

于 2013-10-24T13:30:41.860 に答える