延遲執行與立即執行
一些 LINQ 方法返回一個查詢物件。此物件不包含查詢結果; 相反,它具有生成這些結果所需的所有資訊:
var list = new List<int>() {1, 2, 3, 4, 5};
var query = list.Select(x => {
Console.Write($"{x} ");
return x;
});
該查詢包含對 Console.Write
的呼叫,但沒有輸出到控制檯。這是因為查詢尚未執行,因此傳遞給 Select
的函式從未被評估過。這稱為延遲執行 - 查詢的執行會延遲到稍後的某個時間點。
其他 LINQ 方法強制立即執行查詢; 這些方法執行查詢並生成其值:
var newList = query.ToList();
此時,將為原始列表中的每個值評估傳遞到 Select
的函式,並將以下內容輸出到控制檯:
1 2 3 4 5
通常,返回單個值(例如 Max
或 Count
)的 LINQ 方法或返回實際儲存值的物件(例如 ToList
或 ToDictionary
)立即執行。
返回 IEnumerable<T>
或 IQueryable<T>
的方法返回查詢物件,並允許將執行推遲到稍後的點。
是否有特定的 LINQ 方法強制查詢立即執行,可以在 MSDN - C# 或 VB.NET 中找到 。