我在理解惰性计算与 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
为什么valA
在valB
赋值后才显示一个值,为什么valB
只显示一次值valC
已分配?
下面是我的调试器的屏幕截图。我想我的 IDE 肯定有一些不标准的地方。
(来源:toastermagic.co.uk)
最佳答案
Max
运算符立即执行,根本没有延迟。您所看到的只是调试器的正常行为。当它突出显示一行时,表示“我将要运行这条线”而不是“我刚刚运行了这条线”。您将始终需要在“下一行”上才能查看给定代码行的结果。
看来你已经考虑到了这一点。事实上,您看到所有更改(这不应该只是 LINQ 特定的)一行晚了可能意味着您的源代码和可执行文件有点不同步。您应该清理并重新构建解决方案,然后一切都会好起来的。我猜你对源代码做了一些小的修改,但在构建中没有得到正确的修改,因此可执行文件中的行号与源代码中的行号各相差一个。
如果某事确实非常非常错误,您可以尝试将代码完全移至一个新项目(如果您的代码库足够小),以试图摆脱导致此问题的任何损坏或损坏的文件/设置。
关于c# - linq max惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11543728/