Вы можете перебирать копию коллекции:
foreach(var fullFilePath in new ArrayList(attachmentsFilePath))
{
// do stuff
}
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);
сделайте следующее:
foreach (var fullFilePath in new List(attachmentsFilePath))
{
таким образом вы создадите копию исходного списка для итерации по
Вы можете перебрать коллекцию, чтобы увидеть, какие элементы необходимо удалить, и сохранить эти индексы в отдельной коллекции. Наконец, вам нужно будет перебрать индексы, которые нужно удалить, в обратном порядке и удалить каждый из исходной коллекции.
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);
}
Другой способ сделать это: начать с конца и удалить те, которые вам нужны:
List<int> numbers = new int[] { 1, 2, 3, 4, 5, 6 }.ToList();
for (int i = numbers.Count - 1; i >= 0; i--)
{
numbers.RemoveAt(i);
}
во время перечисления (или использования foreach) вы не можете изменять коллекцию. Если вы действительно хотите удалить элементы, то вы можете пометить их и позже удалить из списка с помощью метода Remove
Вы не можете удалить элемент из коллекции во время итерации по ней.
Вы можете найти индекс элемента, который нужно удалить, и удалить его после завершения итерации.
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
}