InvalidOperationException: Collection was modified при удалении элементов в цикле foreach
Всем добрый день! Создаю 2D игру на Unity. В скрипте есть список(List<>) объектов и при определённых условиях один из объектов удаляется из списка. Но когда это происходит появляется исключение "InvalidOperationException: Collection was modified; enumeration operation may not execute".Пожалуйста, подскажите в чём здесь проблема.
public class PaintingManager : MonoBehaviour
{
public List<PaintingOver> _unpaintedWalls;
private void Update()
{
foreach (var wall in _unpaintedWalls)
{
if (wall.GetComponent<SpriteRenderer>().color != wall._defaultColor)
{
_unpaintedWalls.Remove(wall);
Debug.Log(_unpaintedWalls.Count);
}
}
}
Ответы (3 шт):
Автор решения: timur
→ Ссылка
Это происходит из-за того, что нельзя изменять коллекцию во время её прохождения. Есть три способа исправить это:
foreach (var wall in new List<PaintingOver>(_unpaintedWalls))
{
if (wall.GetComponent<SpriteRenderer>().color != wall._defaultColor)
{
_unpaintedWalls.Remove(wall);
Debug.Log(_unpaintedWalls.Count);
}
}
for (int i = 0; i < _unpaintedWalls.Length; i++)
{
if (_unpaintedWalls[i].GetComponent<SpriteRenderer>().color != _unpaintedWalls[i]._defaultColor)
{
_unpaintedWalls[i].RemoveAt(i--)
Debug.Log(_unpaintedWalls.Count);
}
}
var removeList = new List<PaintingOver>();
foreach (var wall in _unpaintedWalls)
{
if (wall.GetComponent<SpriteRenderer>().color != wall._defaultColor)
{
removeList.Add(wall);
Debug.Log(_unpaintedWalls.Count);
}
}
_unpaintedWalls = _unpaintedWalls.Except(removeList).ToList();
Автор решения: Yaroslav
→ Ссылка
Нужен for с конца и тогда сдвиг при удаления элемента List не будет иметь значение.
List<int> YourList = new List<int>();
for (int i = YourList.Count-1; i >= 0; i--)
if (YourList[i] == 7)
YourList.RemoveAt(i);
Автор решения: bearpro
→ Ссылка
Вижу решения уже есть, но хочу добавить вариант с LINQ:
private void Update() =>
_unpaintedWalls =
_unpaintedWalls
.Where(wall => wall.GetComponent<SpriteRenderer>().color == wall._defaultColor)
.ToList();
Но с Log такое решение не красиво.