次の方法で共有


実行方法による標準クエリ演算子の分類

標準クエリ演算子のメソッドの LINQ to Objects 実装は、主に 2 つの方法 (即時と遅延) で実行されます。遅延実行を使用するクエリ演算子は、さらに 2 つのカテゴリ (ストリーミングと非ストリーミング) に分けることができます。それぞれのクエリ演算子がどのように動作するかを把握しておくと、指定したクエリの結果を理解するうえで役立ちます。これは、データ ソースが変更される場合や、別のクエリの上にクエリを作成する場合に特に便利です。このトピックでは、標準クエリ演算子を、その実行方法に基づいて分類します。

実行方法

Bb882641.collapse_all(ja-jp,VS.110).gif即時

即時実行とは、クエリが宣言されたコード内の位置で、データ ソースが読み取られ、演算が実行されることを意味します。列挙可能でない単一の結果を返す標準クエリ演算子は、すべて即時に実行されます。

Bb882641.collapse_all(ja-jp,VS.110).gif遅延

遅延実行とは、クエリが宣言されたコード内の位置では演算が実行されないことを意味します。演算の実行は、foreach (Visual Basic の For Each) ステートメントを使用するなどの方法により、クエリ変数が列挙されたときにのみ行われます。つまり、クエリの実行結果は、クエリの定義時ではなくクエリの実行時のデータ ソースの内容に依存します。複数回クエリ変数が列挙される場合は、そのたびに結果が変わる可能性があります。戻り値の型が IEnumerable<T> または IOrderedEnumerable<TElement> の標準クエリ演算子は、ほとんどが遅延実行されます。

遅延実行を使用するクエリ演算子は、さらにストリーミングと非ストリーミングに分類できます。

Bb882641.collapse_all(ja-jp,VS.110).gifストリーミング

ストリーミング演算子では、要素を生成する前にすべてのソース データを読み取る必要はありません。実行時に、ストリーミング演算子は読み取ったソース要素ごとに演算を実行し、必要に応じて要素を生成します。ストリーミング演算子は、結果の要素を生成できるまでソース要素の読み取りを続行します。つまり、結果の要素を 1 つ生成するために複数のソース要素が読み取られる場合があります。

Bb882641.collapse_all(ja-jp,VS.110).gif非ストリーミング

非ストリーミング演算子では、結果の要素を生成する前にすべてのソース データを読み取る必要があります。並べ替えやグループ化などの演算はこのカテゴリに分類されます。実行時に、非ストリーミング クエリ演算子はすべてのソース データを読み取ってデータ構造体に格納し、演算を実行して結果の要素を生成します。

分類表

次の表では、それぞれの標準クエリ演算子のメソッドを、その実行方法に基づいて分類しています。

[!メモ]

2 つの列にマークが付けられている演算子では、2 つの入力シーケンスが演算に使用され、各シーケンスの評価は異なります。この場合、遅延実行のストリーミングで評価されるのは、常にパラメーター リストの最初のシーケンスになります。

標準クエリ演算子

Return Type

即時実行

遅延実行 (ストリーミング)

遅延実行 (非ストリーミング)

Aggregate

TSource

x

 

 

All<TSource>

Boolean

x

 

 

Any

Boolean

x

 

 

AsEnumerable<TSource>

IEnumerable<T>

 

x

 

Average

1 つの数値

x

 

 

Cast<TResult>

IEnumerable<T>

 

x

 

Concat<TSource>

IEnumerable<T>

 

x

 

Contains

Boolean

x

 

 

Count

Int32

x

 

 

DefaultIfEmpty

IEnumerable<T>

 

x

 

Distinct

IEnumerable<T>

 

x

 

ElementAt<TSource>

TSource

x

 

 

ElementAtOrDefault<TSource>

TSource

x

 

 

Empty<TResult>

IEnumerable<T>

x

 

 

Except

IEnumerable<T>

 

x

 x

First

TSource

x

 

 

FirstOrDefault

TSource

x

 

 

GroupBy

IEnumerable<T>

 

 

x

GroupJoin

IEnumerable<T>

 

x

Intersect

IEnumerable<T>

 

x

x

Join

IEnumerable<T>

 

x

x

Last

TSource

x

 

 

LastOrDefault

TSource

x

 

 

LongCount

Int64

x

 

 

Max

1 つの数値、TSource、または TResult

x

 

 

Min

1 つの数値、TSource、または TResult

x

 

 

OfType<TResult>

IEnumerable<T>

 

x

 

OrderBy

IOrderedEnumerable<TElement>

 

 

x

OrderByDescending

IOrderedEnumerable<TElement>

 

 

x

Range

IEnumerable<T>

 

x

 

Repeat<TResult>

IEnumerable<T>

 

x

 

Reverse<TSource>

IEnumerable<T>

 

 

x

Select

IEnumerable<T>

 

x

 

SelectMany

IEnumerable<T>

 

x

 

SequenceEqual

Boolean

x

 

 

Single

TSource

x

 

 

SingleOrDefault

TSource

x

 

 

Skip<TSource>

IEnumerable<T>

 

x

 

SkipWhile

IEnumerable<T>

 

x

 

Sum

1 つの数値

x

 

 

Take<TSource>

IEnumerable<T>

 

x

 

TakeWhile

IEnumerable<T>

 

x

 

ThenBy

IOrderedEnumerable<TElement>

 

 

x

ThenByDescending

IOrderedEnumerable<TElement>

 

 

x

ToArray<TSource>

TSource 配列

x

 

 

ToDictionary

Dictionary<TKey, TValue>

x

 

 

ToList<TSource>

IList<T>

x

 

 

ToLookup

ILookup<TKey, TElement>

x

 

 

Union

IEnumerable<T>

 

x

 

Where

IEnumerable<T>

 

x

 

参照

関連項目

Enumerable

概念

標準クエリ演算子の概要

標準クエリ演算子のクエリ式構文

LINQ to Objects