如何遍历正在修改的列表?

时间:2009-07-23 16:58:17

标签: c# list iteration

我有一个我需要迭代的数据集中的行列表。

问题是迭代中的处理可能会从列表中删除一行或多行。

由于列表正在被修改,我不能使用foreach()循环。

但是因为有可能某些删除可能发生在我正在处理的元素之前,所以我也不能使用for()循环(即,如果我正在处理元素,那么会导致删除元素和其他元素,我想不出一种方法来调整i以正确指向我正在处理的元素之后的元素。

你会如何解决这个问题?我目前认为总是处理列表中的第一个元素。如果它被删除,则处理新的第一个元素。如果没有删除,则将其移至“alreadyProcessed”列表,并处理新的第一个元素。

有更简单的方法吗?

5 个答案:

答案 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)

如果您可以将数据放入链接列表中,那就太棒了。