LINQ是懒惰的,实际执行是
deferred
直到调用一个可实现的操作(
Count
,
foreach
,
ToList
,
First
等)。并且将为每个此类操作枚举整个可枚举项。这很容易观察到副作用:
var enumerable = list
.Where(t =>
{
Console.WriteLine("Test deffered: " + t.Content);
return t.Content == "Test1";
});
因此,在这种情况下,您将对整个列表执行两次枚举(
enumerable.Count()
)但在枚举之间,列表已更改,因此您可以看到效果。
这种惰性实际上在很多情况下非常有用——例如,当以动态方式构建查询(通过实体框架为数据库)时:
var query = context.Something.AsQueriable();
if(filter.Name is not null)
{
query = query.Where(s => s.Name == filter.Name);
}
...
或者重用查询以获取不同的结果:
var query = ...;
var total = await query.CountAsync();
var page = await query.Skip(page*size).Take(size).ToListAsync();