以下LINQ语句如何工作?

以下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); } 

输出: 2, 4, 6, 8

为什么不是2, 4, 6

由于推迟执行 ,输出是2,4,6,8

查询实际上是在迭代查询variables时执行的,而不是在创build查询variables时执行的。 这被称为延期执行。

– Suprotim Agarwal, “LINQ中延迟与即时查询执行”

还有一个叫做Immediate Query Execution的执行 ,对于caching查询结果很有用。 再次来自Suprotim Agarwal:

要强制立即执行不产生单例值的查询,可以对查询或查询variables调用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); } 

这是由于延迟执行而发生的,这意味着expression式的计算不会在需要的地方执行。 如果数据太大,这会使性能更好。

原因是延迟执行你的lambdaexpression式。 当你开始在foreach循环中迭代时,查询会被执行。

当你使用一个从LINQ获得的IEnumerable <>时,只会创build一个Enumerator类,迭代只是在某些步骤中使用它时才开始。

你得到这个结果是因为延迟执行,这意味着结果直到第一次访问才被评估。

为了使它更清楚,只需在snipet结尾添加10,然后重新打印,您将不会得到10输出

  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); } //new* list.Add(10); foreach (var i in even) { Console.WriteLine(i); }