簡體   English   中英

LINQ IEnumerable如何在后台運行?

[英]How does a LINQ IEnumerable work under the hood?

閱讀了各種LINQ教程之后,我想知道它在幕后到底是如何工作的,我希望有人可以通過以下示例代碼來確認我的一些問題:

// The Three Parts of a LINQ Query:
//  1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
    from num in numbers
    where (num % 2) == 0
    select num;

// 3. Query execution.
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

我的問題涉及第2部分:

  1. 在這里,我們使用LINQ語法創建IEnumerable對象。 這與foreach語句(如List)中使用的任何其他IEnumerable對象沒有區別嗎?
  2. 與所有IEnumerable一樣,使用foreach語句對內容進行迭代。 我的查詢來自LINQ IEnumerables,使用延遲執行 -何時實際收集IEnumerable的內容? 是在調用GetEnumerator()時嗎?

對於問題2,我的假設是從LINQ查詢生成的對象在GetEnumerator函數內生成代碼,該函數以LINQ語法表示的方式檢索數據。 只是我的猜測...除非我認為LINQ完全錯誤...

您的兩個問題密切相關。

所以,是的,有區別。 LINQ查詢運算符返回裝飾器序列,並且此裝飾啟用了延遲執行 裝飾器序列是另一個序列(在您的情況下為int[] )的包裝,該序列也知道要對包裹的序列應用哪個查詢。 實際執行發生在GetEnumerator().MoveNext()調用中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM