C# - 集合被修改;枚举操作可能不会执行

nid*_*ndo 2 c# collections

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

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

foreach(Person j in lp)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

foreach(Person j in lp.ToList())
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

Dmi*_*try 11

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

你可以做什么:

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

    foreach(Person j in lp.ToArray())
    
    Run Code Online (Sandbox Code Playgroud)

    或者

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

    List<Person> itemsToDoSomething = new List<Person>();
    foreach(Person j in lp)
        itemsToDoSomething.Add(j);
    
    Run Code Online (Sandbox Code Playgroud)

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

    lp.RemoveAll(item => itemsToDoSomething.Contains(item));
    
    Run Code Online (Sandbox Code Playgroud)