標準クエリ演算子メソッドの LINQ to Objects 実装は、即時または遅延の 2 つの主な方法のいずれかで実行されます。 遅延実行を使用するクエリ演算子は、さらに、ストリーミングと非ストリーミングの 2 つのカテゴリに分けることができます。 さまざまなクエリ演算子の実行方法がわかっている場合は、特定のクエリから得られる結果を理解するのに役立つ場合があります。 これは特に、データ ソースが変更されている場合、または別のクエリの上にクエリを作成する場合に当てはまります。 このトピックでは、実行方法に従って標準クエリ演算子を分類します。
実行の方法
直ちに
即時実行とは、データ ソースが読み取られ、クエリが宣言されているコード内のポイントで操作が実行されることを意味します。 列挙不可能な単一の結果を返す標準クエリ演算子はすべて、直ちに実行されます。
保留中
遅延実行とは、クエリが宣言されているコード内のポイントで操作が実行されないことを意味します。 この操作は、クエリ変数が列挙されている場合 (たとえば、 For Each
ステートメントを使用する場合) にのみ実行されます。 つまり、クエリの実行結果は、クエリが定義されている場合ではなく、クエリの実行時にデータ ソースの内容に依存します。 クエリ変数を複数回列挙すると、毎回結果が異なる場合があります。 戻り値の型が IEnumerable<T> または IOrderedEnumerable<TElement> 遅延方式で実行される、ほぼすべての標準クエリ演算子。
遅延実行を使用するクエリ演算子は、さらにストリーミングまたは非ストリーミングとして分類できます。
ストリーミング
ストリーミング演算子は、要素を生成する前にすべてのソース データを読み取る必要はありません。 実行時に、ストリーミング演算子は、読み取り時に各ソース要素に対して操作を実行し、必要に応じて要素を生成します。 ストリーミング演算子は、結果要素を生成できるようになるまでソース要素の読み取りを続行します。 つまり、1 つの結果要素を生成するために、複数のソース要素が読み取られる可能性があります。
非ストリーミング
非ストリーミング演算子は、結果要素を生成する前にすべてのソース データを読み取る必要があります。 並べ替えやグループ化などの操作は、このカテゴリに分類されます。 実行時に、非ストリーミング クエリ演算子はすべてのソース データを読み取り、データ構造に配置し、操作を実行して、結果の要素を生成します。
分類テーブル
次の表は、各標準クエリ演算子メソッドを、その実行方法に従って分類します。
注
1 つの演算子が 2 つの列にマークされている場合、2 つの入力シーケンスが操作に関係し、各シーケンスは異なる方法で評価されます。 このような場合、遅延ストリーミング方式で評価されるのは、パラメーター リストの最初のシーケンスです。
こちらも参照ください
.NET