以下LINQ语句如何工作?

161 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

输出: 2, 4, 6, 8

为什么不2, 4, 6呢?

Ati*_*MVP 235

输出是2,4,6,8因为延迟执行.

查询变量在迭代时实际执行,而不是在创建查询变量时执行.这称为延迟执行.

- Suprotim Agarwal,"推迟与LINQ中的即时查询执行"

还有另一个称为立即查询执行的执行,它对缓存查询结果很有用.来自Suprotim Agarwal:

要强制立即执行不产生单例值的查询,可以 在查询或查询变量上调用ToList(), ToDictionary(), ToArray(), Count(), Average()or 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);
 }
Run Code Online (Sandbox Code Playgroud)

  • Count(),Max(),Avg(),Sum()以及可能需要考虑整个列表的其他方法也会导致查询的评估. (8认同)
  • @Sebastian - 继续@Kenned的评论,`.first()`,`.FirstOrDefault()`,`.Single()`和`.SingleOrDefault()`也触发查询的评估. (4认同)
  • 令人惊讶的是你在不到30秒内得到了答案:D (4认同)
  • @MC我不知道你为什么问这个问题.一次没有给出完整的答案.它被编辑了好几次. (2认同)

San*_*han 11

这是因为延迟执行,这意味着表达式的计算在某个地方需要之前不会执行.如果数据太大,这会使性能更好.

  • 你可能会细微差别,因为它也可能意味着你的昂贵的枚举被多次执行.在这种情况下,您甚至可能会遭受性能损失. (3认同)