Почему этот код выдает «InvalidOperationException» при зацикливании списка?

Я получаю InvalidOperationException при повторении следующего цикла.

foreach (LetterPoint word in NonIntersectingWordsLocations) {
        if (IntersectingWordsLocations.Any(item => item.Position.X == word.Position.X && item.Position.Y == word.Position.Y && item.Letter == word.Letter)) {
            NonIntersectingWordsLocations.Remove(word);
        }
    }

В этой точке кода IntersectingWordsLocations содержит всего 12 элементов, а NonIntersectingWordLocations содержит всего 57 элементов. Оба списка содержат НЕТ недопустимых или нулевых элементов.

Один из этих элементов списка выглядит в списке следующим образом: {(LETTER:R, POSITION:(X:1Y:2))}

Вот класс, который я использую для списка...

LetterPoint.cs

public class LetterPoint : LetterData<Point>, IEquatable<LetterPoint> {
    public Point Position {
        get { return Item; }
        set { Item = value; }
    }
    public LetterPoint(char c = ' ', int row = 0, int col = 0) {
        Letter = c;
        Position = new Point(row, col);
    }
    public string PositionToString => $"(X:{Item.X}Y:{Item.Y})";
    public override string ToString() => $"(LETTER:{Letter}, POSITION:{PositionToString})";

    // TO USE THE .COMPARE FUNCTION IN THE MAIN FILE
    public bool Equals(LetterPoint other) => Letter == other.Letter && Position == other.Position;
}

Почему я получаю эту ошибку?

EDIT: Сообщение об ошибке, которое я получаю, это...

Произошло необработанное исключение типа «System.InvalidOperationException» в mscorlib.dll.

Дополнительная информация: Коллекция изменена; операция перечисления может не выполняться.


person TheAuzzieJesus    schedule 03.08.2016    source источник
comment
Вы имеете в виду сообщение об исключении, в котором конкретно сообщается, что вам не разрешено изменять коллекцию во время ее повторения? (Не то, чтобы мы знали это, поскольку вы не включили текст ошибки в вопрос)   -  person Damien_The_Unbeliever    schedule 03.08.2016
comment
Хотя связанный ответ объясняет, как это сделать с помощью цикла for, вы также можете использовать List.RemoveAll(Predicate<T>) для удаления элементов. Если это не список, а реализует IList<T>, используйте цикл for и выполните итерацию в обратном направлении (от последнего элемента).   -  person Groo    schedule 03.08.2016


Ответы (1)


Поскольку вы не можете изменять (удалять или добавлять элементы) в список во время каждой операции над ним, попробуйте вместо этого использовать цикл for.

person Dr.Haimovitz    schedule 03.08.2016
comment
Важно отметить, что цикл for должен повторяться в обратном порядке, чтобы это работало правильно (или индекс должен уменьшаться при каждой операции удаления). - person Groo; 03.08.2016