作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我的理解是 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的结果?
最佳答案
因为它没有意义,如果你考虑所有没有意义的情况,你就不会问了。这与其说是一个“它有时有意义吗”的问题,不如说是一个“是否存在使它变坏的副作用”的问题。下次你评估这样的事情时,想想负面因素:
这样的事情很难明智地从开发人员那里夺走选择权。想要一个缓冲区,制作一个(很容易)。但是副作用会很糟糕。
关于c# - 为什么 LINQ 不缓存枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37437893/
我是一名优秀的程序员,十分优秀!