繁体   English   中英

LINQ查询重用和延迟执行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM