Enumerable.Range(0, 20).Select(i =>
{
long x = 1;
for (int j = 1; j <= i; j++)
{
x *= j;
}
Console.WriteLine(i + "計算完成");
return x;
});
當你嘗試運行上面的代碼,會發現並沒有輸出,這是為什么呢?
根據MSDN上的說法是:此方法是使用延遲執行實現的。 即時返回值是一個對象,該對象存儲執行操作所需的所有信息。 此方法表示的查詢在枚舉對象之前不會執行,方法是通過直接調用 GetEnumerator
方法或在 Visual Basic 中使用視覺C#對象中的 foreach
或 For Each
來枚舉對象。
意思就是它只是存儲了一個操作,相當於存儲了一個委托,只有在枚舉時才執行委托。
即:將結果ToList時就會產生輸出,因為ToList是會枚舉對象
Enumerable.Range(0, 20).Select(i =>
{
long x = 1;
for (int j = 1; j <= i; j++)
{
x *= j;
}
Console.WriteLine(i + "計算完成");
return x;
}).ToList();
PS:不只是Select,只要是返回類型為IEnumerable的都是一樣 (Where,Union,Zip,Skip,TakeWhile等)