Исключение во время итерации коллекции и удаления элементов из этой коллекции [duplicate]

5
задан Glorfindel 9 July 2019 в 10:05
поделиться

7 ответов

Вы можете перебирать копию коллекции:

foreach(var fullFilePath in new ArrayList(attachmentsFilePath))
{
    // do stuff
}
2
ответ дан 18 December 2019 в 11:55
поделиться
    List<string> names = new List<string>() { "Jon", "Eric", "Me", "AnotherOne" };
    List<string> list = new List<string>() { "Person1", "Paerson2","Eric"};

    list.RemoveAll(x => !names.Any(y => y == x));
    list.ForEach(Console.WriteLine);
2
ответ дан 18 December 2019 в 11:55
поделиться

сделайте следующее:

foreach (var fullFilePath in new List(attachmentsFilePath))
{

таким образом вы создадите копию исходного списка для итерации по

0
ответ дан 18 December 2019 в 11:55
поделиться

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

list<int> itemsToDelete

for(int i = 0; i < items.Count; i++)
{
    if(shouldBeDeleted(items[i]))
    {
        itemsToDelete.Add(i);
    }
}

foreach(int index in itemsToDelete.Reverse())
{
    items.RemoveAt(i);
}
0
ответ дан 18 December 2019 в 11:55
поделиться

Другой способ сделать это: начать с конца и удалить те, которые вам нужны:

List<int> numbers = new int[] { 1, 2, 3, 4, 5, 6 }.ToList();
for (int i = numbers.Count - 1; i >= 0; i--)
{
    numbers.RemoveAt(i);
}
6
ответ дан 18 December 2019 в 11:55
поделиться

во время перечисления (или использования foreach) вы не можете изменять коллекцию. Если вы действительно хотите удалить элементы, то вы можете пометить их и позже удалить из списка с помощью метода Remove

0
ответ дан 18 December 2019 в 11:55
поделиться

Вы не можете удалить элемент из коллекции во время итерации по ней.

Вы можете найти индекс элемента, который нужно удалить, и удалить его после завершения итерации.

int indexToRemove = 0;

// Iteration start

if (fileName.Equals(names[i].Trim()))
{
    indexToRemove = i;
    break;
}

// End of iteration

attachmentsFilePath.RemoveAt(indexToRemove);

Если, однако, вам нужно удалить более одного элемента, выполняйте итерацию над копией списка:

foreach(string fullFilePath in new List<string>(attachmentsFilePath))
{
    // check and remove from _original_ list
}
5
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: