1

可能重复:
集合已修改;枚举操作可能无法执行

我有一个通用列表,我在枚举时执行一些操作。

foreach(Action<string> action in actionList) 
{
    if(action != null) {
        action(mystring);
    }
}

现在我得到了这个例外:

InvalidOperationException:
Collection was modified; enumeration operation may not execute

如何解决这个问题,我被 .NET 3.5 钉牢了:/

4

2 回答 2

6

好吧,大概其中一个动作修改了actionList,使迭代器无效。避免错误的最简单方法是首先获取列表的副本,例如

foreach(Action<string> action in actionList.ToList()) 
{
    if(action != null) {
        action(mystring);                               
    }
}

甚至:

foreach (var action in actionList.Where(action => action != null).ToList())
{
    action(mystring);
}
于 2012-04-19T11:30:33.287 回答
0

您在迭代期间修改了 actionList。它可能是与当前循环或进行修改或另一次迭代的操作方法不同步的第二个线程。所以解决方案可能是:

var tmp = new List<Action<string> >(actionList);
foreach(Action<string> action in tmp) 
{
    if(action != null) {
      action(mystring);                               
    }
}

但它仅在操作修改的情况下才有效,在并行线程的情况下,您应该同步列表。

于 2012-04-19T11:32:36.477 回答