C# linq最大延迟评估
我在理解延迟求值与linq Max操作符的关系时遇到了一些困难 这是我的代码: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
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文件夹,以确保它正在重新编译。哦,好吧。感谢对答案的评论,因为它似乎解决了问题。考虑到一个新项目修复了这个问题,问题似乎真的是构建之间的不同步。