依據執行方式將標準查詢運算式分類

標準查詢運算子方法之 Objects 實作的 LINQ 會以兩種主要方法的其中一種執行:立即或延後。 使用延後執行的查詢運算子可另外細分成兩個分類:資料流和非資料流。如果您知道不同的查詢運算子如何執行,則有助於了解所收到查詢的結果。 這種情況在資料來源變更或您在某個查詢上建置另一個查詢時尤其如此。 本主題將根據執行方式分類標準查詢運算子。

執行方式

Bb882641.collapse_all(zh-tw,VS.110).gif立即

立即執行表示會在程式碼中宣告查詢的位置讀取資料來源及執行作業。 所有傳回單一、不可列舉結果的標準查詢運算子都會立即執行。

Bb882641.collapse_all(zh-tw,VS.110).gif已延期

延後執行表示作業不會在程式碼中宣告查詢的位置執行。 作業只會在列舉查詢變數時執行,例如藉由使用 foreach (Visual Basic 中為 For Each) 陳述式。 這表示執行查詢的結果是根據查詢執行時,而不是定義查詢時的資料來源內容而定。 如果多次列舉查詢變數,則結果可能每次都不同。幾乎所有傳回型別為 IEnumerable<T>IOrderedEnumerable<TElement> 的標準查詢運算子都會以延後的方式執行。

使用延後執行的查詢運算子可另外分類為資料流或非資料流。

Bb882641.collapse_all(zh-tw,VS.110).gif資料流

資料流運算子在產生項目之前,不需要讀取所有來源資料。 執行時,資料流運算子會於讀取每個來源項目時執行其作業,並且產生項目 (如果適當的話)。 資料流運算子會繼續讀取來源項目,直到能夠產生結果項目為止。 這表示可能會讀取多個來源項目,以產生一個結果項目。

Bb882641.collapse_all(zh-tw,VS.110).gif非資料流

非資料流運算子必須讀取所有來源資料,才能產生結果項目。 例如排序或分組這類作業都屬於這個分類。 執行時,非資料流查詢運算子會讀取所有來源資料,將資料輸入資料結構,執行作業並產生結果項目。

分類表

下表會根據執行方法分類每個標準查詢運算子方法。

注意事項注意事項

如果某個運算子在兩個資料行中標記,則作業中包含兩個輸入序列,且每個序列會分別評估。這些情況下,參數清單中的第一個序列會固定以延後的資料流方式評估。

標準查詢運算子

Return Type

立即執行

延後資料流執行

延後非資料流執行

Aggregate

TSource

X

 

 

All<TSource>

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<TSource>

IEnumerable<T>

 

X

 

Average

單一數值

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

單一數值、TSource 或 TResult

X

 

 

Min

單一數值、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

單一數值

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