关于C#:C# – 集合被修改;

C# - Collection was modified; enumeration operation may not execute

本问题已经有最佳答案,请猛点这里访问。

在我编写的一个冗长的代码中有一个按钮单击事件。我有一个物品清单。每次单击按钮时,应修改列表(例如,应删除某些项),然后使用for each循环进行迭代。

1
2
3
4
5
6
7
List<Person> lp=new List<Person>();
lp.RemoveAt(2);

foreach(Person j in lp)
{
    // do something
}

当我尝试执行上述代码时,它会导致异常。

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

我在网上找到了一些解决方案并尝试了。其中之一是

1
2
3
4
foreach(Person j in lp.ToList())
{
    // do something
}

但是没有什么能阻止这个例外。

有人能帮忙吗?


显然,您的do something代码正试图修改集合。在迭代集合时修改它通常是一个坏主意。

你能做的:

  • 将集合复制到其他集合。

    1
    foreach(Person j in lp.ToArray())

    1
    foreach(Person j in new List<Person>(lp))
  • 使用修改项的临时集合。

    1
    2
    3
    List<Person> itemsToDoSomething = new List<Person>();
    foreach(Person j in lp)
        itemsToDoSomething.Add(j);

    然后应用所需的操作。例如,从集合中移除项:

    1
    lp.RemoveAll(item => itemsToDoSomething.Contains(item));

  • 尝试修改克隆列表并将引用复制回(只是一个想法):

    1
    List<Person> newList = new List<Person>(lp);lp = newList;

    基本上,在遍历列表时不允许修改它