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 |