[英]Can't remove item from list in C#
在我的游戲的庫存中,如果你放下它,我想刪除它。 這僅適用於像這樣的 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);
}
沒發生什么事。 有誰知道如何解決這一問題?
要從列表中刪除項目,執行以下操作就足夠了:
public void DeleteItem(Item itemToRemove)
{
items.Remove(itemToRemove);
}
您實際上不必遍歷列表。 如果似乎什么也沒發生,請檢查Remove的返回值。 如果該項目已被刪除,則返回true
如果在列表中找不到該項目,則返回false
。
關於您收到的錯誤消息:在枚舉列表時,不得通過添加/刪除項目來修改列表。 這會改變列表的長度,並拋出枚舉,所以這是不允許的。
該錯誤表明您在循環遍歷集合的同時正在更改它。 這是不安全的,因為一旦集合更改,迭代器狀態可能不再有效。 例如,迭代器可能指向列表中的索引 3,但如果您刪除項目 0(將其他所有內容移回),那么您最終會跳過。 拋出此錯誤通過使其顯而易見來避免這種微妙的錯誤。
在這種特殊情況下,您不需要循環:只需刪除該項目。
如果您想進行批量刪除,請考慮像 RemoveAll 這樣的方法。
另一種選擇是遍歷列表的副本,這樣您就可以自由地修改它。 例如,您可以遍歷 items.ToArray()。
附加了另一個腳本,如果我放下槍,它會直接將項目添加回來,所以這就是錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.