延迟执行与立即执行
一些 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 中找到 。