在这段代码中,在我实际枚举结果元素之前,源'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);
}
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"
。