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 такое решение не красиво.

→ Ссылка