延迟执行与立即执行

一些 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

通常,返回单个值(例如 MaxCount)的 LINQ 方法或返回实际保存值的对象(例如 ToListToDictionary)立即执行。

返回 IEnumerable<T>IQueryable<T> 的方法返回查询对象,并允许将执行推迟到稍后的点。

是否有特定的 LINQ 方法强制查询立即执行,可以在 MSDN - C#VB.NET 中找到