gpt4 book ai didi

c# - 为什么 LINQ 不缓存枚举?

转载 作者:行者123 更新时间:2023-11-30 19:04:50 27 4
gpt4 key购买 nike

所以我的理解是 LINQ 不会立即执行所有操作,它只是存储信息以获取数据。因此,如果您执行 Where,列表实际上不会发生任何变化,您只会得到一个 IEnumerable,其中包含成为列表所需的信息。

可以通过调用 ToList 将此信息“折叠”到实际列表中。

现在我想知道,为什么 LINQ 团队会这样实现它?在每一步添加一个 List(或一个 Dictionary)来缓存已经计算出的结果是很容易的,所以我想这一定是有充分理由的。

这可以通过以下代码进行检查:

var list = Enumerable.Range(1, 10).Where(i => {
Console.WriteLine("Enumerating: " + i);
return true;
});

var list2 = list.All(i => {
return true;
});

var list3 = list.Any(i => {
return false;
});

如果缓存在那里,它只会为每个数字输出一次Enumerating: i,它会在第二次从缓存中获取项目。

编辑:另外一个问题,为什么 LINQ 不包含缓存选项?像.Cache()缓存上一个enumerable的结果?

最佳答案

因为它没有意义,如果你考虑所有没有意义的情况,你就不会问了。这与其说是一个“它有时有意义吗”的问题,不如说是一个“是否存在使它变坏的副作用”的问题。下次你评估这样的事情时,想想负面因素:

  • 内存消耗会增加,因为您必须缓存结果,即使不需要。
  • 在接下来的运行中,结果可能会有所不同,因为传入的数据可能已更改。您的简单示例 (Enumerable.Range) 对此没有问题 - 但过滤客户列表可能会使他们更新。

这样的事情很难明智地从开发人员那里夺走选择权。想要一个缓冲区,制作一个(很容易)。但是副作用会很糟糕。

关于c# - 为什么 LINQ 不缓存枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37437893/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com