実行方法による標準クエリ演算子の分類
標準クエリ演算子のメソッドの LINQ to Objects 実装は、主に 2 つの方法 (即時と遅延) で実行されます。 遅延実行を使用するクエリ演算子は、さらに 2 つのカテゴリ (ストリーミングと非ストリーミング) に分けることができます。それぞれのクエリ演算子がどのように動作するかを把握しておくと、指定したクエリの結果を理解するうえで役立ちます。 これは、データ ソースが変更される場合や、別のクエリの上にクエリを作成する場合に特に便利です。 このトピックでは、標準クエリ演算子を、その実行方法に基づいて分類します。
実行方法
即時
即時実行とは、クエリが宣言されたコード内の位置で、データ ソースが読み取られ、演算が実行されることを意味します。 列挙可能でない単一の結果を返す標準クエリ演算子は、すべて即時に実行されます。
遅延
遅延実行とは、クエリが宣言されたコード内の位置では演算が実行されないことを意味します。 演算の実行は、foreach (Visual Basic の For Each) ステートメントを使用するなどの方法により、クエリ変数が列挙されたときにのみ行われます。 つまり、クエリの実行結果は、クエリの定義時ではなくクエリの実行時のデータ ソースの内容に依存します。 複数回クエリ変数が列挙される場合は、そのたびに結果が変わる可能性があります。戻り値の型が IEnumerable または IOrderedEnumerable の標準クエリ演算子は、ほとんどが遅延実行されます。
遅延実行を使用するクエリ演算子は、さらにストリーミングと非ストリーミングに分類できます。
ストリーミング
ストリーミング演算子では、要素を生成する前にすべてのソース データを読み取る必要はありません。 実行時に、ストリーミング演算子は読み取ったソース要素ごとに演算を実行し、必要に応じて要素を生成します。 ストリーミング演算子は、結果の要素を生成できるまでソース要素の読み取りを続行します。 つまり、結果の要素を 1 つ生成するために複数のソース要素が読み取られる場合があります。
非ストリーミング
非ストリーミング演算子では、結果の要素を生成する前にすべてのソース データを読み取る必要があります。 並べ替えやグループ化などの演算はこのカテゴリに分類されます。 実行時に、非ストリーミング クエリ演算子はすべてのソース データを読み取ってデータ構造体に格納し、演算を実行して結果の要素を生成します。
分類表
次の表では、それぞれの標準クエリ演算子のメソッドを、その実行方法に基づいて分類しています。
注意
2 つの列にマークが付けられている演算子では、2 つの入力シーケンスが演算に使用され、各シーケンスの評価は異なります。この場合、遅延実行のストリーミングで評価されるのは、常にパラメーター リストの最初のシーケンスになります。
標準クエリ演算子 |
Return Type |
即時実行 |
遅延実行 (ストリーミング) |
遅延実行 (非ストリーミング) |
---|---|---|---|---|
TSource |
x |
|
|
|
x |
|
|
||
x |
|
|
||
|
x |
|
||
1 つの数値 |
x |
|
|
|
|
x |
|
||
|
x |
|
||
x |
|
|
||
x |
|
|
||
|
x |
|
||
|
x |
|
||
TSource |
x |
|
|
|
TSource |
x |
|
|
|
x |
|
|
||
|
x |
x |
||
TSource |
x |
|
|
|
TSource |
x |
|
|
|
|
|
x |
||
|
x |
x |
||
|
x |
x |
||
|
x |
x |
||
TSource |
x |
|
|
|
TSource |
x |
|
|
|
x |
|
|
||
1 つの数値、TSource、または TResult |
x |
|
|
|
1 つの数値、TSource、または TResult |
x |
|
|
|
|
x |
|
||
|
|
x |
||
|
|
x |
||
|
x |
|
||
|
x |
|
||
|
|
x |
||
|
x |
|
||
|
x |
|
||
x |
|
|
||
TSource |
x |
|
|
|
TSource |
x |
|
|
|
|
x |
|
||
|
x |
|
||
1 つの数値 |
x |
|
|
|
|
x |
|
||
|
x |
|
||
|
|
x |
||
|
|
x |
||
TSource 配列 |
x |
|
|
|
x |
|
|
||
x |
|
|
||
x |
|
|
||
|
x |
|
||
|
x |
|