列表未修改但错误:集合已修改;枚举操作可能无法执行

时间:2012-09-17 17:14:11

标签: c# c#-3.0

我有以下变量

public IEnumerable<SelectListItem> SelectedGroups { get; set; }
Dictionary<string,string> grpsList;

以下是我的迭代

if(condition)
 viemodel.SelectedGroups = selectlist1;
else
  viemodel.SelectedGroups = selectlist2;

foreach (var item in viemodel.SelectedGroups) <<--Error message
       grpsList.Remove(item.Value);

我没有修改选定的组,而是使用它作为参考从grpsList中删除但是它在foreach声明中失败。


添加了代码, selectlist1包含对grpsList的引用,类似这样(删除了其他连接和所有其他代码)

from g in grpsList
select g).ToSelectList(g => g.Value, g => g.Key);

selectlist2是不同的列表。

2 个答案:

答案 0 :(得分:3)

您可以尝试使用

foreach (var item in viemodel.SelectedGroups.ToList<SelectListItem>()) 
{
       grpsList.Remove(item.Value);
}

答案 1 :(得分:2)

最有可能SelectedGroups指向涉及grpsList的linq表达式。 要避免此问题,请在.ToList()的分配之前执行SelectedGroups。 (您仍然可以将属性签名保留为IEnumerable<SelectListItem>

使用您添加的代码:

from g in grpsList
select g).ToSelectList(g => g.Value, g => g.Key).ToList(); <-- here

请注意,如果您没有对linq表达式执行ToList(),那么每次迭代枚举器时都会评估完整的linq语句。这可能会导致许多不必要的性能问题。