C# 无法更新IEnumerable迭代器变量

C# 无法更新IEnumerable迭代器变量,c#,.net,C#,.net,我被下一个行为困住了: var contracts = result.Select(this.Map); foreach (var contract in contracts) { contract.Id = 1; } return contracts; 循环后契约.id未更新,仍具有初始值 var contracts=result.Select(this.Map.ToList()解决了我的问题,但我不明白为什么不能更新迭代变量的属性?您需要记住LINQ查询的结果是表示查询的对象,而

我被下一个行为困住了:

var contracts = result.Select(this.Map);
foreach (var contract in contracts) {
    contract.Id = 1;
}

return contracts;
循环后
契约.id
未更新,仍具有初始值


var contracts=result.Select(this.Map.ToList()解决了我的问题,但我不明白为什么不能更新迭代变量的属性?

您需要记住LINQ查询的结果是表示查询的对象,而不是该查询的结果<代码>契约
是一个对象,当迭代时,它将执行基础集合中每个对象到新对象的映射。每次迭代时,它都会再次执行映射

在您的例子中,您迭代源集合,执行映射,编辑这些对象,将这些对象扔到地板上,再次迭代集合,再次执行映射,然后查看这些对象,因此您所做的编辑当然不会被看到


当您调用
ToList
时,您现在不再存储查询,而是观察该查询的结果,以及对该集合中项目的编辑,因为您在后续迭代中查看的是相同的项目。

在这些情况下,建议:不要使用
var
,使用显式类型。@ytoledano这是当人们没有意识到他们的变量是实际的类型时通常会给出的建议。他们问题的标题清楚地表明,他们知道类型是一个
IEnumerable
,它就是。如果他们认为这不是什么,那就表明
var
正在咬他们。