C#3.0新增功能09 LINQ 標準查詢運算符 03 按執行方式的分類
- 2019 年 10 月 4 日
- 筆記
標準查詢運算符方法的 LINQ to Objects 實現主要通過兩種方法之一執行:立即執行和延遲執行。使用延遲執行的查詢運算符可以進一步分為兩種類別:流式處理和非流式處理。 如果你了解不同查詢運算符的執行方式,則有助於理解從給定查詢中獲得的結果。 如果數據源是不斷變化的,或者如果你要在另一個查詢的基礎上構建查詢,這種幫助尤其明顯。 本篇根據標準查詢運算符的執行方式對其進行分類。
執行方式
即時
立即執行指的是在代碼中聲明查詢的位置讀取數據源並執行運算。 返回單個不可枚舉的結果的所有標準查詢運算符都立即執行。
推遲
延遲執行指的是不在代碼中聲明查詢的位置執行運算。 僅當對查詢變量進行枚舉時才執行運算,例如通過使用 foreach
語句執行。 這意味着,查詢的執行結果取決於執行查詢而非定義查詢時的數據源內容。 如果多次枚舉查詢變量,則每次結果可能都不同。 幾乎所有返回類型為 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的標準查詢運算符皆以延遲方式執行。
使用延遲執行的查詢運算符可以另外分類為流式處理和非流式處理。
流式處理
流式處理運算符不需要在生成元素前讀取所有源數據。 在執行時,流式處理運算符一邊讀取每個源元素,一邊對該源元素執行運算,並在可行時生成元素。 流式處理運算符將持續讀取源元素直到可以生成結果元素。 這意味着可能要讀取多個源元素才能生成一個結果元素。
非流式處理
非流式處理運算符必須先讀取所有源數據,然後才能生成結果元素。 排序或分組等運算均屬於此類別。 在執行時,非流式處理查詢運算符將讀取所有源數據,將其放入數據結構,執行運算,然後生成結果元素。
分類表
下表按照執行方法對每個標準查詢運算符方法進行了分類。
如果某個運算符被標入兩個列中,則表示在運算中涉及兩個輸入序列,每個序列的計算方式不同。 在此類情況下,參數列表中的第一個序列始終以延遲流式處理方式來執行計算。
標準查詢運算符 |
返回類型 |
立即執行 |
延遲的流式處理執行 |
延遲非流式處理執行 |
---|---|---|---|---|
Aggregate |
TSource |
X |
|
|
All |
Boolean |
X |
|
|
Any |
Boolean |
X |
|
|
AsEnumerable |
IEnumerable<T> |
|
X |
|
Average |
單個數值 |
X |
|
|
Cast |
IEnumerable<T> |
|
X |
|
Concat |
IEnumerable<T> |
|
X |
|
Contains |
Boolean |
X |
|
|
Count |
Int32 |
X |
|
|
DefaultIfEmpty |
IEnumerable<T> |
|
X |
|
Distinct |
IEnumerable<T> |
|
X |
|
ElementAt |
TSource |
X |
|
|
ElementAtOrDefault |
TSource |
X |
|
|
Empty |
IEnumerable<T> |
X |
|
|
Except |
IEnumerable<T> |
|
X |
X |
First |
TSource |
X |
|
|
FirstOrDefault |
TSource |
X |
|
|
GroupBy |
IEnumerable<T> |
|
|
X |
GroupJoin |
IEnumerable<T> |
|
X |
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 |
IEnumerable<T> |
|
X |
|
OrderBy |
IOrderedEnumerable<TElement> |
|
|
X |
OrderByDescending |
IOrderedEnumerable<TElement> |
|
|
X |
Range |
IEnumerable<T> |
|
X |
|
Repeat |
IEnumerable<T> |
|
X |
|
Reverse |
IEnumerable<T> |
|
|
X |
Select |
IEnumerable<T> |
|
X |
|
SelectMany |
IEnumerable<T> |
|
X |
|
SequenceEqual |
Boolean |
X |
|
|
Single |
TSource |
X |
|
|
SingleOrDefault |
TSource |
X |
|
|
Skip |
IEnumerable<T> |
|
X |
|
SkipWhile |
IEnumerable<T> |
|
X |
|
Sum |
單個數值 |
X |
|
|
Take |
IEnumerable<T> |
|
X |
|
TakeWhile |
IEnumerable<T> |
|
X |
|
ThenBy |
IOrderedEnumerable<TElement> |
|
|
X |
ThenByDescending |
IOrderedEnumerable<TElement> |
|
|
X |
ToArray |
TSource 數組 |
X |
|
|
ToDictionary |
Dictionary<TKey,TValue> |
X |
|
|
ToList |
IList<T> |
X |
|
|
ToLookup |
ILookup<TKey,TElement> |
X |
|
|
Union |
IEnumerable<T> |
|
X |
|
Where |
IEnumerable<T> |
|
X |