C# Lambda评估意外地重新评估?
关于lambda求值和lambda内联属性设置,一定有一些我不理解的地方。我有以下代码:C# Lambda评估意外地重新评估?,c#,lambda,collections,C#,Lambda,Collections,关于lambda求值和lambda内联属性设置,一定有一些我不理解的地方。我有以下代码: var zeroGroupings = ruleList.Rules.Where(r => r.DiagnosticGrouping == 0); // line 1 var oneGroupings = ruleList.Rules.Where(r => r.DiagnosticGrouping == 1); // line 2 var twoGroupings = ruleList.Rule
var zeroGroupings = ruleList.Rules.Where(r => r.DiagnosticGrouping == 0); // line 1
var oneGroupings = ruleList.Rules.Where(r => r.DiagnosticGrouping == 1); // line 2
var twoGroupings = ruleList.Rules.Where(r => r.DiagnosticGrouping == 2); // line 3
zeroGroupings.ForEach(r => r.DiagnosticGrouping = 1); // line 4
oneGroupings.ForEach(r => r.DiagnosticGrouping = 2); // line 5
twoGroupings.ForEach(r => r.DiagnosticGrouping = 3); // line 6
注意:ruleList.Rules
是Rule
对象的集合(IEnumerable
)。保持它的简单和最小化,我认为任何人都不需要对规则列表
或规则列表了解太多。规则
,除了规则
对象之外,还有一个名为诊断分组
的属性
以这种情况为例:
假设一个ruleList.Rules
包含两个规则对象,并且两个对象的诊断分组均为0。第1-4行按预期执行
zeroGroupings has a count of 2.
oneGroupings has a count of 0.
twoGroupings has a count of 0.
一切如期而至
执行第4行后,我的2规则
对象的DiagnosticGrouping
值均为1,如预期的那样。但是,在执行第5行之后,2规则
对象突然有一个诊断分组
为2。什么?在执行第6行之后,两个规则对象现在的DiagnosticGrouping
值为3
我希望,在这个场景中,第5行和第6行不会匹配任何内容,因此不会执行任何操作。似乎第2行和第3行以某种方式在第5行和第6行中被重新计算,从而匹配,因此属性被再次设置。我不明白
我需要做什么才能使一切按预期执行?
其中
是延迟执行查询。它不会立即评估并填充集合;相反,它在自身迭代时执行-扫描原始源以查找匹配项。它在每次迭代时都这样做。原因包括可组合性和内存使用。事实上,不仅源数据可以在查询创建和迭代之间更改,而且由于“捕获变量”的工作方式,过滤器本身也可以在这段时间内更改
基本上:如果您希望它现在执行到列表中,请在的Where(…)
后面添加.ToList()
:
var zeroGroupings=ruleList.Rules.Where(r=>r.DiagnosticGrouping==0.ToList();
其中
是延迟执行查询。它不会立即评估并填充集合;相反,它在自身迭代时执行-扫描原始源以查找匹配项。它在每次迭代时都这样做。原因包括可组合性和内存使用。事实上,不仅源数据可以在查询创建和迭代之间更改,而且由于“捕获变量”的工作方式,过滤器本身也可以在这段时间内更改
基本上:如果您希望它现在执行到列表中,请在的Where(…)
后面添加.ToList()
:
var zeroGroupings=ruleList.Rules.Where(r=>r.DiagnosticGrouping==0.ToList();
它按预期执行Where
extension returnIQueryable
您需要具体化它,这就是延迟执行的全部思想。懒惰的评估。这能回答你的问题吗?它按预期执行Where
extension returnIQueryable
您需要具体化它,这就是延迟执行的全部思想。懒惰的评估。这能回答你的问题吗?解决了的。谢谢,问题解决了。非常感谢。