c# - linq max惰性求值

标签 c# linq lazy-evaluation

我在理解惰性计算与 linq Max 运算符的关系时遇到了一些麻烦。

这是我的代码:

        var someList = new List<someType>
        {
            new someType { decimalValue = 32 }
        };

第 1 行:var valA = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;

第 2 行:var valB = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;

第 3 行:var valC = valB;

单步执行代码时,我看到以下行为:

第 1 行执行后,valA = 0, valB = 0, valC = 0

第 2 行执行后,valA = 32, valB = 0, valC = 0

第 3 行执行后,valA = 32, valB = 32, valC = 32

为什么valAvalB赋值后才显示一个值,为什么valB只显示一次值valC 已分配?

下面是我的调试器的屏幕截图。我想我的 IDE 肯定有一些不标准的地方。

IDE image
(来源:toastermagic.co.uk)

最佳答案

Max 运算符立即执行,根本没有延迟。您所看到的只是调试器的正常行为。当它突出显示一行时,表示“我将要运行这条线”而不是“我刚刚运行了这条线”。您将始终需要在“下一行”上才能查看给定代码行的结果。

看来你已经考虑到了这一点。事实上,您看到所有更改(这不应该只是 LINQ 特定的)一行晚了可能意味着您的源代码和可执行文件有点不同步。您应该清理并重新构建解决方案,然后一切都会好起来的。我猜你对源代码做了一些小的修改,但在构建中没有得到正确的修改,因此可执行文件中的行号与源代码中的行号各相差一个。

如果某事确实非常非常错误,您可以尝试将代码完全移至一个新项目(如果您的代码库足够小),以试图摆脱导致此问题的任何损坏或损坏的文件/设置。

关于c# - linq max惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11543728/

相关文章:

c# - 确定通用列表之间的差异

c# - 序列不包含任何元素?

r - 为什么惰性求值不会破坏这段代码?

Python惰性迭代器

python - 如何实现惰性 setdefault?

c# - c#计算两个文本文件的百分比差异

c# - 在区域内时的 Blazor 路由和布局

c# - 动态 LINQ

c# - 从 xml 中读取属性

c# - 如何编写强类型的 lambda 表达式?