Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# Lambda评估意外地重新评估?_C#_Lambda_Collections - Fatal编程技术网

C# 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

关于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.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 return
IQueryable
您需要具体化它,这就是延迟执行的全部思想。懒惰的评估。这能回答你的问题吗?它按预期执行
Where
extension return
IQueryable
您需要具体化它,这就是延迟执行的全部思想。懒惰的评估。这能回答你的问题吗?解决了的。谢谢,问题解决了。非常感谢。