標準查詢運算符方法的 LINQ to Objects 實現主要經過兩種方法之一執行:當即執行和延遲執行。使用延遲執行的查詢運算符能夠進一步分爲兩種類別:流式處理和非流式處理。 若是你瞭解不一樣查詢運算符的執行方式,則有助於理解從給定查詢中得到的結果。 若是數據源是不斷變化的,或者若是你要在另外一個查詢的基礎上構建查詢,這種幫助尤爲明顯。 本篇根據標準查詢運算符的執行方式對其進行分類。html
當即執行指的是在代碼中聲明查詢的位置讀取數據源並執行運算。 返回單個不可枚舉的結果的全部標準查詢運算符都當即執行。api
延遲執行指的是不在代碼中聲明查詢的位置執行運算。 僅當對查詢變量進行枚舉時才執行運算,例如經過使用 foreach
語句執行。 這意味着,查詢的執行結果取決於執行查詢而非定義查詢時的數據源內容。 若是屢次枚舉查詢變量,則每次結果可能都不一樣。 幾乎全部返回類型爲 IEnumerable<T> 或 IOrderedEnumerable<TElement> 的標準查詢運算符皆以延遲方式執行。數組
使用延遲執行的查詢運算符能夠另外分類爲流式處理和非流式處理。數據結構
流式處理運算符不須要在生成元素前讀取全部源數據。 在執行時,流式處理運算符一邊讀取每一個源元素,一邊對該源元素執行運算,並在可行時生成元素。 流式處理運算符將持續讀取源元素直到能夠生成結果元素。 這意味着可能要讀取多個源元素才能生成一個結果元素。spa
非流式處理運算符必須先讀取全部源數據,而後才能生成結果元素。 排序或分組等運算均屬於此類別。 在執行時,非流式處理查詢運算符將讀取全部源數據,將其放入數據結構,執行運算,而後生成結果元素。code