У меня есть список строк из набора данных, который мне нужно пропустить.
Проблема в том, что обработка в итерации может удалить одну или несколько строк из списка.
Поскольку список изменяется, я не могу использовать цикл foreach().
Но так как возможно, некоторые из делеций могут возникать в элементах, предшествующих той, которую я обрабатываю, я также не могу использовать цикл for() (т.е. если я обрабатываю элемент, и это приводит к удаление элемента и других элементов, я не могу придумать способ настроить i, чтобы правильно указать на элемент, следующий за тем, который я обрабатывал).
Как бы вы справились с этой проблемой? Мое настоящее подумало, что всегда обрабатывать первый элемент в списке. Если он удаляется, обработайте новый первый элемент. Если он не удаляется, переместите его в список "уже обработанный" и обработайте новый первый элемент.
Есть ли более простой способ?
При изменении списка, который я выполняю, я всегда считаю, что проще всего создать новый список с элементами, которые я хочу сохранить, а затем использовать новый список для выполнения того, что я собирался делать.
По-моему, действительно зависит от того, что вы делаете с данными, когда закончите.
Обычно это делается с помощью обратной петли:
List<string> Items = ...
for(int i = Items.Count - 1; i >= 0; i--)
{
if(Items[i] == "DELETE ME")
{
Items.RemoveAt(i);
}
}
Это приводит к обработке элементов в обратном порядке, поэтому, если вы удаляете элемент, это не влияет на позицию любых элементов, которые еще предстоит обработать.
for(int i = list.Length -1, i >= 0; i--)
{
// process and delete if you want
}
i
int i = 0;
while (i < dataSet.Tables[0].Rows.Count) {
if (some_condition) {
dataSet.Tables[0].Rows.RemoveAt(i);
continue;
}
i++;
}
Если вы можете получить свои данные в связанном списке, вы будете золотыми.