LINQ延迟执行-为什么它不考虑Enumerable.Range的结果的变化

本文关键字:Range Enumerable 结果 变化 不考虑 延迟 执行 为什么 LINQ | 更新日期: 2023-09-27 17:50:44

在这段代码中,在我实际枚举结果元素之前,源'source'再次被加载。我看到的主要是Employee类的例子——我们有一个Employee对象的列表,在枚举某些查询的结果之前,添加了一个额外的对象,它确实出现在输出枚举中。

var source = Enumerable.Range(1, 25);
var elements = from num in source
               num < 5
               select num;
source = Enumerable.Range(0, 25);
foreach (int num in elements)
{
   Console.WriteLine(num);
}

在输出中不包括0。因为查询只在枚举开始时执行,不应该打印0吗?有什么是我搞砸的吗?

编辑:我很抱歉,但我需要再澄清一点。下面的代码片段打印10和20——它与上面的场景有什么不同?

var numbers = new List<int>();
    numbers.Add(1);
    IEnumerable<int> query = numbers.Select(n => n * 10);
    numbers.Add(2);
    foreach (int num in query)
    {
        Console.WriteLine(num);
    }

LINQ延迟执行-为什么它不考虑Enumerable.Range的结果的变化

elements的定义捕获了变量source所指向的东西:

var source = Enumerable.Range(1, 25);
var elements = from num in source
               num < 5
               select num;

当你重新分配source时,你只是改变了变量的指向。elements仍然引用source在定义elements时所指向的东西。

这与LINQ没有任何关系。如果我们写这样的代码:

var address = "123 Cherry Lane";
var contact = new Contact(address);
address = "junk";

联系人的地址仍然是"123 Cherry Lane"