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