我在理解惰性评估与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一定有一些非标准的东西。

c# - LINQ MAX懒惰评估-LMLPHP
(来源:toastermagic.co.uk

最佳答案

Max运算符会立即执行,根本不会延迟。您所看到的只是调试器的正常行为。突出显示一行时,它表示“我将要运行此行”,而不是“我只是运行了此行”。您总是需要在“下一行”上查看给定代码行的结果。

看来您已经考虑了这一点。您会在一行之后看到所有更改(这不仅是特定于LINQ的事实),这可能意味着您的源代码和可执行文件有点不同步。您应该对解决方案进行重新整理,然后一切都应该没问题。我猜想您对源代码进行了一些小的修改,而这些修改没有在构建中正确获取,因此可执行文件与源代码中的行号各相距一个。

如果确实存在某些问题,则可以尝试将代码完全移到新项目中(如果您的代码库足够小),以消除引起该问题的任何损坏或损坏的文件/设置。

关于c# - LINQ MAX懒惰评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11543728/

10-12 20:25