Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq最大延迟评估_C#_Linq_Lazy Evaluation - Fatal编程技术网

C# linq最大延迟评估

C# linq最大延迟评估,c#,linq,lazy-evaluation,C#,Linq,Lazy Evaluation,我在理解延迟求值与linq Max操作符的关系时遇到了一些困难 这是我的代码: var someList = new List<someType> { new someType { decimalValue = 32 } }; var someList=新列表 { 新someType{decimalValue=32} }; line1:var valA=someList.Any()?最大值(s=>s.deci

我在理解延迟求值与linq Max操作符的关系时遇到了一些困难

这是我的代码:

        var someList = new List<someType>
        {
            new someType { decimalValue = 32 }
        };
var someList=新列表
{
新someType{decimalValue=32}
};
line1:var valA=someList.Any()?最大值(s=>s.decimalValue):0.0M

line2:var valB=someList.Any()?最大值(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肯定有一些不标准的地方



(来源:)

Max
操作符立即执行,完全不延迟。您看到的只是调试器的正常行为。当它突出显示一行时,它的意思是“我即将运行这行”,而不是“我刚刚运行这行”。您总是需要在“下一行”上才能看到给定代码行的结果

看来你已经解释清楚了。您看到的所有更改(这不应该只是LINQ特定的)延迟一行可能意味着您的源代码和可执行文件有点不同步。你应该做一个清洁和重建的解决方案,然后一切都应该是好的。我猜您对源代码进行了一些小的修改,但是在构建中没有正确地获取这些代码,因此可执行文件中的行号与源代码中的行号是一一对应的

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

无法复制:

    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();
    }
一切正常


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

任何
最大值
都会立即执行。@TimSchmelter两者都会立即执行(尽管
任何
的另一个重载被延迟)。@Servy:这就是我所说的,除了重载被延迟之外。也会立即执行。它只是在
foreach
中使用一个谓词,如果任何元素为它返回true,则返回true,否则返回false。@TimSchmelter你说的
any
Max
,与
any
Max
相反。它不仅是一个,而且是两个。顺便说一句,一个更简单的样式应该是
var val1=anotherList.DefaultIfEmpty().Max()。我知道IDE是如何逐步完成代码的,请参见我在编辑中添加的图表。我确实想到了这一点,但清理后重新构建了解决方案,在新的解决方案中仍然可以很好地完成相同的工作-我无法解释这一点,因为我删除了obj和bin文件夹,以确保它正在重新编译。哦,好吧。感谢对答案的评论,因为它似乎解决了问题。考虑到一个新项目修复了这个问题,问题似乎真的是构建之间的不同步。