C# - 集合已修改;枚举操作可能无法执行

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

在我写的很长的代码中有一个按钮点击事件。我有一个对象列表。每次单击按钮时,都应修改列表(例如,应删除某些项目),然后使用 foreach 循环进行迭代。

List<Person> lp=new List<Person>();
lp.RemoveAt(2);

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

当我尝试执行上面的代码时,出现异常。

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

在网上找了一些解决办法,试了一下。其中之一是,

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

但是没有什么可以阻止异常。

有人可以帮忙吗?

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

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

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

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

你能做什么:

  1. 将集合复制到另一个。

    foreach(Person j in lp.ToArray())
    

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

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

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

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