下面的LINQ条语句是如何工作的?

以下是我的代码:

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0);
list.Add(8);
foreach (var i in even)
{
    Console.WriteLine(i);
}

Output: 2, 4, 6, 8

为什么不是2, 4, 6

推荐答案

输出是2,4,6,8,因为是deferred execution.

当查询变量

--苏普罗蒂姆·阿加瓦尔,"Deferred vs Immediate Query Execution in LINQ"

还有另一个名为Immediate Query Execution的执行,用于缓存查询结果.再次来自Suprotim Agarwal:

若要强制立即执行不生成单个值的查询,可以对查询或查询变量调用ToList(), ToDictionary(), ToArray(), Count(), Average()Max()方法.这些称为转换操作符,允许您复制/快照结果和访问次数,而无需重新执行查询.

如果希望输出为2,4,6,请使用.ToList():

var list = new List<int>{1,2,4,5,6};
var even = list.Where(m => m%2 == 0).ToList();
list.Add(8);
foreach (var i in even)
 {
    Console.WriteLine(i);
 }

.net相关问答推荐

.NET 4.5 项目未在 Visual Studio 2022 中编译

信号量的多线程问题

使用 PostAsJsonAsync C# 时出现错误请求

将 Span 传递到函数时出现 F# 错误

C#6.0 字符串插值本地化

EF Core 添加迁移构建失败

System.ValueTuple 和 System.Tuple 有什么区别?

找不到用于调试 .NET 源代码的 .cs 文件

为什么具有可为空值的结构的 HashSet 非常慢?

如何解码 JWT 令牌?

如果 async-await 不创建任何额外的线程,那么它如何使应用程序响应?

为什么 Visual Studio 2012 找不到我的测试?

Windows SDK 7.1 安装失败

为什么 !0 是 Microsoft 中间语言 (MSIL) 中的一种类型?

如何将 VB 项目转换为 C# 项目

运行多个异步任务并等待它们全部完成

创建堆栈大小为默认值 50 倍的线程时有什么危险?

为什么 HttpClient BaseAddress 不起作用?

Microsoft.Bcl.Build NuGet 包有什么作用?

如何明智地使用 StringBuilder?