在我的游戏清单中,如果您删除某个物品,我想删除它。只能在这样的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);
}
什么都没有发生。有人知道如何解决这个问题吗?
答案 0 :(得分:5)
要从列表中删除项目,只需执行以下操作:
public void DeleteItem(Item itemToRemove)
{
items.Remove(itemToRemove);
}
您实际上不必遍历该列表。如果似乎什么也没发生,请检查Remove的返回值。如果已删除该项目,则返回true
,如果在列表中找不到该项目,则返回false
。
关于您收到的错误消息:枚举列表时,一定不要通过添加/删除项目来修改列表。这样会更改列表的长度,并会抛出枚举,因此是不允许的。
答案 1 :(得分:1)
该错误表示您正在循环浏览集合的同时进行更改。这是不安全的,因为一旦集合更改,迭代器状态可能不再有效。例如,迭代器可能指向列表中的索引3,但是如果您删除项目0(将其他所有内容都移回),则最终会跳过。抛出此错误可以使其变得明显,从而避免了这种细微的错误。
在这种情况下,您不需要循环:只需删除该项即可。
如果要批量删除,请考虑类似RemoveAll的方法。
另一个选择是遍历列表的副本,这使您可以自由地对其进行修改。例如,您可以遍历items.ToArray()。
答案 2 :(得分:1)
还有一个附加的脚本,如果我放下了枪,它会直接将物品重新添加回去,这就是错误。