[英]LINQ query reuse and deferred execution
我的印象是,我可以创建一个LINQ查询,然后在更改涉及的参数的同时重用它。 但似乎您无法更改源集合。 有人可以给我一个很好的解释,为什么,因为我显然误解了一些基本知识。
这是一些示例代码。
var source = Enumerable.Range(1, 10);
var value = source.Where(x => x > 5);
var first = value.ToArray();
source = Enumerable.Range(11, 20);
var second = value.ToArray();
我期望第一是6,7,8,9,10,第二是11至20。
当您这样做时:
source = Enumerable.Range(11, 20);
您正在创建一个新对象。 但是, Where
查询仍然具有对旧对象的引用。
source = Enumerable.Range(11, 20);
var second = value.ToArray();
second = Enumerable.Range(11, 20);
var second = value.ToArray();
找到一个不同;)
因为value = source.Where(x => x > 5)
急切地评估source
的值,但会推迟x => x > 5
部分的评估。 当您重新分配来源时,原始范围仍然存在,来源只是指向另一个范围。 简而言之,lambda内部的值是惰性计算的。
延迟执行的示例
source = Enumerable.Range(1,10).ToArray();
value = source.Where(x => x > 5);
var first = value.ToArray(); // 6,7,8,9,10
source.[0] = 100;
var second = value.ToArray(); // 100,6,7,8,9,10
懒惰地访问源代码的示例 (我不建议使用这种类型的代码,这是一个如何在lambda中访问source
变量的示例,该示例创建了一个“闭包”来延迟对source
的访问
source = Enumerable.Range(1,10);
value = Enumerable.Range(1).SelectMany(n => source.Where(x => x > 5));
var first = value.ToArray();
source = Enumerable.Range(11,20);
var second = value.ToArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.