Удаление элемента из списка

Я программирую на С#. Я пытаюсь удалить элемент из List<>, но когда я удаляю элемент, я получаю эту ошибку исключения:

Исключение типа «System.InvalidOperationException» возникло в mscorlib.dll, но не было обработано в пользовательском коде.

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

Вот мой код:

foreach (Target t in targetList)
{
    if (t.CalculateDistance(t.EndX, t.EndY) <= 5)
    {
        targetList.Remove(t);
    }
}

Я получаю исключение в первой строке. Почему я вижу эту ошибку? или Как я могу это исправить?


person Babak.Abad    schedule 24.04.2015    source источник
comment
вы не можете изменить во время перечисления. вместо этого выполните цикл for.   -  person Dom    schedule 24.04.2015
comment
Вы можете: использовать цикл for, который я не рекомендую, ваш iterator, скорее всего, в какой-то момент окажется за пределами допустимого диапазона; создайте второй List или Array для хранения значений, которые вы хотите удалить, затем добавьте каждое значение, которое вы хотите удалить, в List или Array и после завершения выполните итерацию по этим List или Array и удалите их из исходных List или Array.   -  person Der Kommissar    schedule 24.04.2015
comment
Your iterator will likely end up out-of-range at some point нет, если вы пойдете назад   -  person Ňɏssa Pøngjǣrdenlarp    schedule 24.04.2015
comment
@Plutonix Это правда, хотя и не рекомендуется. Как я уже сказал, вероятно. OP должен ссылаться на запрос LINQ в первом ответе здесь.   -  person Der Kommissar    schedule 24.04.2015
comment
это одна из причин, почему я почти никогда не использую foreach. РЖУ НЕ МОГУ   -  person RadioSpace    schedule 24.04.2015


Ответы (2)


Проблема, с которой вы сталкиваетесь, заключается в том, что вы не можете изменить коллекцию, которую перебираете. Вы можете решить это, используя linq:

targetList.RemoveAll(t => t.CalculateDistance(t.EndX, t.EndY) <= 5);
person Luc    schedule 24.04.2015
comment
Действительный ответ, но было бы полезно, если бы вы описали, ПОЧЕМУ решение OP не работает. Это была первая часть его вопроса. - person Rufus L; 24.04.2015

Попробуй это:

var needdelete = new List<Target>();

foreach (Target t in targetList)
{
    if (t.CalculateDistance(t.EndX, t.EndY) <= 5)
    {
        needdelete.Add(t);           
    }
}

targetlist.RemoveRange(needdelete);
person Uğurhan Gül    schedule 24.04.2015
comment
Этот ответ уродлив по сравнению с другим, но имеет желаемый эффект. - person Der Kommissar; 24.04.2015
comment
Действительный ответ, но было бы полезно, если бы вы описали, ПОЧЕМУ решение OP не работает. Это была первая часть его вопроса. - person Rufus L; 24.04.2015