次の方法で共有


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

更新 : 2007 年 11 月

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

実行方法

即時

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

遅延

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

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

ストリーミング

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

非ストリーミング

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

分類表

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

メモ :

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

標準クエリ演算子

戻り値の型

即時実行

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

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

Aggregate

TSource

 

 

All<TSource>

Boolean

 

 

Any

Boolean

 

 

AsEnumerable<TSource>

IEnumerable<T>

 

Average

1 つの数値

 

 

Cast<TResult>

IEnumerable<T>

 

 

Concat<TSource>

IEnumerable<T>

 

 

Contains

Boolean

 

 

Count

Int32

 

 

DefaultIfEmpty

IEnumerable<T>

 

 

Distinct

IEnumerable<T>

 

 

ElementAt<TSource>

TSource

 

 

ElementAtOrDefault<TSource>

TSource

 

 

Empty<TResult>

IEnumerable<T>

 

 

Except

IEnumerable<T>

First

TSource

 

 

FirstOrDefault

TSource

 

 

GroupBy

IEnumerable<T>

 

 

GroupJoin

IEnumerable<T>

Intersect

IEnumerable<T>

Join

IEnumerable<T>

Last

TSource

 

 

LastOrDefault

TSource

 

 

LongCount

Int64

 

 

Max

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

 

 

Min

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

 

 

OfType<TResult>

IEnumerable<T>

 

 

OrderBy

IOrderedEnumerable<TElement>

 

 

OrderByDescending

IOrderedEnumerable<TElement>

 

 

Range

IEnumerable<T>

 

 

Repeat<TResult>

IEnumerable<T>

 

 

Reverse<TSource>

IEnumerable<T>

 

 

Select

IEnumerable<T>

 

 

SelectMany

IEnumerable<T>

 

 

SequenceEqual

Boolean

 

 

Single

TSource

 

 

SingleOrDefault

TSource

 

 

Skip<TSource>

IEnumerable<T>

 

 

SkipWhile

IEnumerable<T>

 

 

Sum

1 つの数値

 

 

Take<TSource>

IEnumerable<T>

 

 

TakeWhile

IEnumerable<T>

 

 

ThenBy

IOrderedEnumerable<TElement>

 

 

ThenByDescending

IOrderedEnumerable<TElement>

 

 

ToArray<TSource>

TSource 配列

 

 

ToDictionary

Dictionary<TKey, TValue>

 

 

ToList<TSource>

IList<T>

 

 

ToLookup

ILookup<TKey, TElement>

 

 

Union

IEnumerable<T>

 

 

Where

IEnumerable<T>

 

 

参照

概念

標準クエリ演算子の概要

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

LINQ to Objects

参照

Enumerable