31

どの.netフレームワークのlinqメソッド(たとえば、.IEnumerable linqメソッド)が遅延実行を使用して実装されているか、または遅延実行を使用して実装されていないかを確認する最も簡単な方法は何ですか。

何度もコーディングしているうちに、これが正しく実行されるのではないかと思います。確認する唯一の方法は、MSDNのドキュメントにアクセスして確認することです。より迅速な方法、ディレクトリ、Web上のどこかのリスト、チートシート、共有できるその他のトリックはありますか?はいの場合は、そうしてください。これは、多くのlinq初心者(私のような)がミスを減らすのに役立ちます。他の唯一のオプションは、覚えるのに十分なほどドキュメントを使用するまでドキュメントをチェックすることです(これは私にとって難しいことです。どこかにドキュメント化されて検索できる「何か」を覚えていない傾向があります:D)。

4

6 に答える 6

38

通常、シーケンスを返すメソッドは、遅延実行を使用します。

IEnumerable<X> ---> Select ---> IEnumerable<Y>

単一のオブジェクトを返すメソッドは、次のことを行いません。

IEnumerable<X> ---> First ---> Y

したがって、、、、、などのメソッドは、実行Whereできるために遅延実行を使用しますが、、、、、などのメソッドは使用できないため使用しません。SelectTakeSkipGroupByOrderByFirstSingleToListToArray

遅延実行には2つのタイプもあります。たとえば、Selectメソッドはアイテムの作成を求められたときに一度に1つのアイテムのみを取得しますが、OrderByメソッドは最初のアイテムを返すように求められたときにソース全体を消費する必要があります。したがって、OrderByアフターをチェーンするSelectと、最初のアイテムを取得するまで実行は延期されますが、その後、はすべてのアイテムOrderByを要求します。Select

于 2010-10-08T21:46:47.860 に答える
8

私が使用するガイドライン:

  • IEnumerable<T>遅延実行を返す、またはIQueryable<T>使用できる、おそらく使用するAPIを常に想定します。このようなAPIを使用していて、結果を複数回繰り返す必要がある場合(たとえば、カウントを取得するため)、その前にコレクションに変換します(通常は.ToList()拡張メソッドを呼び出します)。

  • 列挙型を公開する場合、クライアントが通常使用するものであれば、常にコレクション(ICollection<T>または)として公開します。IList<T>たとえば、データアクセス層は多くの場合、ドメインオブジェクトのコレクションを返します。IEnumerable<T>公開するAPIにとって、実行の延期が妥当なオプションである場合にのみ公開します。

于 2010-10-08T22:54:49.137 に答える
5

実際には、もっとあります。さらに、バッファリングと非バッファリングを考慮する必要があります。OrderByは延期できますが、繰り返す場合はストリーム全体を消費する必要があります。

一般に、IEnumerableを返すLINQのすべては延期される傾向がありますが、Minなど(値を返す)は延期されません。バッファリング(対ではない)は通常推論できますが、率直に言ってリフレクターは確実に見つけるための非常に迅速な方法です。ただし、これはとにかく実装の詳細であることが多いことに注意してください。

于 2010-10-08T21:49:07.510 に答える
2

実際の「遅延実行」には、IQueryableで機能するメソッドが必要です。IQueryableに基づくメソッドチェーンは、クエリを表す式ツリーを構築します。IQueryableを受け取り、具象またはIEnumerableの結果(ToList()など、AsEnumerable()など)を生成するメソッドを呼び出す場合にのみ、ツリーはLinqプロバイダーによって評価されます(Linq2Objectsは、Linq2SQLおよび現在はMSEFです。他のORMと永続化レイヤーフレームワークもLinqプロバイダーを提供します)、実際の結果が返されます。フレームワーク内の任意のIEnumerableクラスは、AsQueryable()拡張メソッドを使用してIQueryableにキャストでき、ORMなどの式ツリーを変換するLinqプロバイダーは、次のようなlinqクエリのジャンプオフポイントとしてAsQueryable()を提供します。彼らのデータ。

IEnumerableに対しても、Linqメソッドの一部は「遅延」です。IEnumerableの利点は、すべてを知る必要がないことです。現在の要素と、別の要素があるかどうかだけを知る必要がないため、IEnumerableに作用するLinqメソッドは、多くの場合、ソースからオブジェクトを吐き出すイテレータクラスを返します。チェーンの後半のメソッドは1つを要求します。セット全体の知識を必要としない操作は、遅延評価できます(SelectとWhereは2つの大きなもので、他にもあります)。コレクション全体を知る必要があるもの(OrderByによる並べ替え、GroupByによるグループ化、MinやMaxなどの集計)は、リストまたは配列に列挙可能なソース全体を丸呑みして処理し、すべての上位ノードを介してすべての要素の評価を強制します。一般的、

于 2010-10-08T21:50:57.383 に答える
2

クエリが延期されるかどうかを知るためのさまざまな方法の概要は次のとおりです。

  1. クエリメソッド構文の代わりにクエリ式構文を使用している場合は、延期されます。

  2. クエリメソッド構文を使用している場合は、返される内容に応じて延期される可能性があります。

  3. varキーワードにカーソルを合わせます(クエリの保存に使用される変数のタイプとして使用している場合)。それが言うならIEnumerable<T>、それは延期されるでしょう。

  4. foreachを使用してクエリを反復処理してみてください。をサポートしていないために変数を反復処理できないというエラーが発生した場合はGetEnumerator()、クエリが延期されていないことがわかります。

出典:Essential Linq

于 2019-01-25T01:00:49.503 に答える
1

.AsQueryable()を使用してコレクションをIQueryableにキャストすると、LINQ呼び出しは遅延実行を使用します。

ここを参照してください:LinqでのIQueryableの使用

于 2010-10-08T21:45:58.617 に答える