C#为什么List.Remove()打破'for循环'?

Adr*_*dry 1 c# for-loop list

我真的不知道为什么for循环只循环一次.我认为逻辑是正确的,下面是代码.

// the list is named 'dataList'

for(int i = 0 ; i < dataList.Count; i ++)
{
    string[] data = dataList[i].Split('+');
    string[] wsno = data[0].Split(':');
    if(wsno[1].Equals(tbWorkSheet.Text)) 
    {
        dataList.Remove(dataList[i])   <<<< remove string that has the same number
        //data removed
        //for loop ends up here idk why..
    }
}
Run Code Online (Sandbox Code Playgroud)

dataList.Count将是列表的大小.

这种情况是这样的..我想删除存储在列表中的多个字符串,每个字符串都有其组号.因此,for循环将循环直到最后一个循环.但是当它找到一个与所需字符串具有相同编号的字符串时,它将执行if语句以删除它.

Eve*_*lie 6

这是一个非常糟糕的主意.通过从列表中删除值,您将跳过列表中的下一个项目.

例如,列表中的索引0,1,2有3个项目.

第一次迭代:i = 0您在索引0处移除项目.列表现在具有索引0,1处的项目(已删除第一项).

第二次迭代:i = 1.注意这里位于索引1的项目如何移动到0.当我们的索引计数器从0变为1.所以我们将"跳过"这个项目.

如果您的列表中只有2个项目,他将在第一次删除后中断.这是因为在索引增加时计数会减少.

通过反向顺序,您将消除此问题.

List<int> list = new List<int> { 2, 1 };
for (int i = list.Count - 1; i >= 0; i--)
{
    list.RemoveAt(i);
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如罗林提到的那样,如果你在移除物品时减少了计数器,你可以继续前进.

for (int i = 0; i < list.Count; i++)
{
    list.RemoveAt(i--);
}
Run Code Online (Sandbox Code Playgroud)