从List(Of)中删除项会导致System.InvalidOperationException

时间:2017-09-05 12:03:57

标签: vb.net list collections foreach

如果遇到某种情况,我需要从List(Of)中删除项目。

我更喜欢这样做:

plot 2

但是,当我删除一个项目时,会更改该集合,并且For Next语句无法继续,并且抛出System.InvalidOperationException。

我想知道是否有任何一般方法可以正确地做到这一点,而无需编写大的解决方法。

有人可以告诉我们应该如何正确地做到这一点吗?

我附上测试​​代码以查看错误:

For Each nClass As SomeClass In MyList
    If (Something) Then
        MyList.Remove(nClass)
    End If
Next 

1 个答案:

答案 0 :(得分:0)

正如Plutonix所说,你需要在你的循环中向后工作 -

更改

For Each nItem As SomeClass In nList
    If nItem.Int > 1 And nItem.Int < 5 Then
        nList.Remove(nItem)
    End If
Next

For I As Integer = nList.Count to 0 Step -1
    If nlist(I).Int > 1 And nList(I).Int < 5 Then
        nList.RemoveAt(I)
    End If
Next

原因是在For Each..Next循环中,对象中的项目数在循环开始时记录并且不会更改。即使您在对象中添加或删除项目。

例如。假设您从10个字母的列表开始。

A

C

d

电子

˚F

ħ

Ĵ

因此。在For Each循环开始时,记录项目数(10)。当循环遍历列表时,假设您删除“E”。

出于这个解释的目的,哪一个并不重要。无论如何,你最终将所有后续项目移回一个。因此,指数位置5的位置将位于第4位,依此类推至指数10的位置现在位于指数9处。循环继续,当它尝试访问索引10处的项时,它不存在,因为它超出了列表的边界,现在有9个项目。

相反,如果您使用“For..Next”循环向后踩,并从列表项开始向后,当您说“E”并想要删除它,然后一次又一次地倒退直到你到达第一个项目,第一个项目仍然在同一个索引位置,所以没问题。