下面的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相关问答推荐

dotnet 8 web api在部署到docker后无法工作

在 F# 中处理 Option - Some(null) 的好策略是什么

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

信号量的多线程问题

图像 UriSource 和数据绑定

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

在 C# 中将字节数组保存为磁盘上的文件的最有效方法是什么?

Environment.TickCount 与 DateTime.Now

一种消耗(所有字节)BinaryReader 的优雅方式?

无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0

创建多个线程并等待所有线程完成

自定义属性的构造函数何时运行?

形成两个列表并集的最简单方法

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

dotnet 恢复警告 NU1701

什么是 ToString("N0") 格式?

如何仅在需要时提升权限?

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

如果选中,则更改列表框项的 WPF DataTemplate

不签署 .NET 程序集有什么问题吗?