无法从C#列表中删除项目

时间:2019-12-21 15:56:07

标签: c# list visual-studio unityscript

在我的游戏清单中,如果您删除某个物品,我想删除它。只能在这样的foreach循环中使用:

public List<Item> items = new List<Item>();

public void DeleteItem(Item itemToRemove)
{
    foreach (var item in items)
    {
        items.Remove(itemToRemove);
    }
}

但随后出现此错误:

  

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

当我尝试这样做时:

public void DeleteItem(Item itemToRemove)
{
        items.Remove(itemToRemove);
}

什么都没有发生。有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

要从列表中删除项目,只需执行以下操作:

public void DeleteItem(Item itemToRemove) 
{
  items.Remove(itemToRemove);
}

您实际上不必遍历该列表。如果似乎什么也没发生,请检查Remove的返回值。如果已删除该项目,则返回true,如果在列表中找不到该项目,则返回false

关于您收到的错误消息:枚举列表时,一定不要通过添加/删除项目来修改列表。这样会更改列表的长度,并会抛出枚举,因此是不允许的。

答案 1 :(得分:1)

该错误表示您正在循环浏览集合的同时进行更改。这是不安全的,因为一旦集合更改,迭代器状态可能不再有效。例如,迭代器可能指向列表中的索引3,但是如果您删除项目0(将其他所有内容都移回),则最终会跳过。抛出此错误可以使其变得明显,从而避免了这种细微的错误。

在这种情况下,您不需要循环:只需删除该项即可。

如果要批量删除,请考虑类似RemoveAll的方法。

另一个选择是遍历列表的副本,这使您可以自由地对其进行修改。例如,您可以遍历items.ToArray()。

答案 2 :(得分:1)

还有一个附加的脚本,如果我放下了枪,它会直接将物品重新添加回去,这就是错误。