foreach循环正确设置属性但稍后出现错误

时间:2012-12-06 18:29:45

标签: c# asp.net-mvc foreach

我有一个返回结果的数据库查询,我有一个包含另一个IEnumerable的IEnumerable,在Model Populator中我做了类似的事情

List<Parent> parents = Result1;
List<Children> children = Result2;

然后

foreach (parent p in parents)
{
 p.MyChildren = children.Where(x => x.ParentId == p.Id);
}

我到目前为止已调试过,当我在循环期间以及包含模型的最终模型返回模型时数据都是正确的。

然而,在控制器上我得到了一个父母列表,他们都拥有相同的子集合,即使它们在一会儿之前是正确的。 这意味着每个父级在“MyChildren”中具有相同的随机集合,而不是属于它们的集合。

我的视图模型在任何地方都没有静态变量,并且从模型到控制器没有其他对象操作。

引用的东西真的很奇怪,我不知道如何解决它。 有什么想法吗?

1 个答案:

答案 0 :(得分:3)

设置子项时,请尝试在右侧添加ToList()

foreach (parent p in parents)
{
    var id = p.Id;
    parent.MyChildren = children.Where(x => x.ParentId == id).ToArray();
}

Where的结果是IEnumerable,并且推迟了对项目的实际检索。这意味着如果事情稍后发生变化,parent.MyChildren会发生变化。添加ToArray()会强制枚举立即发生。

根据Servy的评论更新

您还必须创建foreach的本地(p.Id块内)副本(上面更新)。此问题称为“访问已修改的闭包”更多信息:for example.有关更多背景信息,请参阅here,其中包括Eric Lippert的答案,他将修改后的闭包描述为最糟糕的“陷阱之一“在C#