gpt4 book ai didi

vb.net - 如何判断 LINQ 查询何时被枚举?

转载 作者:行者123 更新时间:2023-12-03 00:37:46 25 4
gpt4 key购买 nike

乍一看,这似乎是一个愚蠢的问题,但请继续阅读。

我知道 LINQ 查询是延迟的,并且仅在枚举查询时才执行,但我无法准确确定这种情况何时发生。当然,在 For Each 循环中,将枚举查询。要遵循的经验法则是什么?如果结果很大,我不想意外地枚举查询两次。

例如,System.Linq.Enumerable.First 是否枚举整个查询?我询问性能原因。我想将 LINQ 结果集传递给 ASP.NET MVC View ,并且还想单独传递 First 元素。枚举两次结果会很痛苦。

如果能够打开某种标志,每次枚举 LINQ 查询时都会向我发出警报,那就太好了。这样,当我不小心枚举两次时,我可以捕获场景。

最佳答案

您可以add your own logging很容易看到发生了什么。除此之外,懒惰/渴望的部分是相当清楚的。基本上它是懒惰的,只要它可以 - 任何时候返回类型是 IEnumerable<T>IOrderedEnumerable<T> 。这些人可能很懒,因为如果不调用 GetEnumerator() 就无法获取任何数据 。与 First() 进行比较例如 - 它必须向您返回一个值。它不能推迟任何事情。

一般而言,如果您想确保不会多次评估某个查询,请调用 ToListToArray就可以了,然后多次使用结果。同样,这些方法必须立即返回列表或数组,这两种方法都不允许延迟填充。查询被评估,但随后它实际上与生成的填充集合断开连接 - 无论您如何检查列表,查询都不会再次执行。

除了懒惰/急切的问题之外,还有流式/非流式:该方法是否会从可枚举的源中读取所有内容,或者只是“啜饮”它,在需要时读取。同样,一般来说 LINQ 仅在必要时才会读取 - 所以 while Reverse是非流式的(但仍然很懒),WhereSelect正在直播。

关于vb.net - 如何判断 LINQ 查询何时被枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1462984/

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