2

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

IDE 映像
(来源:toastermagic.co.uk

4

2 回答 2

1

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

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

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

于 2012-07-18T14:36:11.027 回答
0

无法复制:

    static void Main(string[] args)
    {
        var data = (from n in Enumerable.Range(0, 10)
                    select new { value = (decimal)n })
                   .ToList();

        var valA = data.Any() ? data.Max(s => s.value) : 0.0M;
        Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, 0, 0);

        var valB = data.Any() ? data.Max(s => s.value) : 0.0M;
        Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, valB, 0);

        var valC = valB;
        Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, valB, valC);

        Console.ReadLine();
    }

按预期工作。

看起来是对调试器的误读。

于 2012-07-18T14:40:46.143 回答