我有一个我需要迭代的数据集中的行列表。
问题是迭代中的处理可能会从列表中删除一行或多行。
由于列表正在被修改,我不能使用foreach()循环。
但是因为有可能某些删除可能发生在我正在处理的元素之前,所以我也不能使用for()循环(即,如果我正在处理元素,那么会导致删除元素和其他元素,我想不出一种方法来调整i以正确指向我正在处理的元素之后的元素。
你会如何解决这个问题?我目前认为总是处理列表中的第一个元素。如果它被删除,则处理新的第一个元素。如果没有删除,则将其移至“alreadyProcessed”列表,并处理新的第一个元素。
有更简单的方法吗?
答案 0 :(得分:8)
通常这是通过反向循环完成的:
List<string> Items = ...
for(int i = Items.Count - 1; i >= 0; i--)
{
if(Items[i] == "DELETE ME")
{
Items.RemoveAt(i);
}
}
这会导致以相反的顺序处理项目,因此如果删除项目,它不会影响仍要处理的任何项目的位置。
答案 1 :(得分:2)
当修改我正在迭代的列表时,我总是发现用我想要保留的项目构建一个新列表是最简单的,然后使用新列表来做我应该做的任何事情。
我想,这完全取决于你完成后对数据做了什么。
答案 2 :(得分:0)
for(int i = list.Length -1, i >= 0; i--)
{
// process and delete if you want
}
答案 3 :(得分:0)
int i = 0;
while (i < dataSet.Tables[0].Rows.Count) {
if (some_condition) {
dataSet.Tables[0].Rows.RemoveAt(i);
continue;
}
i++;
}
答案 4 :(得分:0)
如果您可以将数据放入链接列表中,那就太棒了。