我在理解惰性评估与linq Max运算符之间的关系时遇到了一些麻烦。
这是我的代码:
var someList = new List<someType>
{
new someType { decimalValue = 32 }
};
line1: var valA = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;
line2: var valB = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;
line3: 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/