如果遇到某种情况,我需要从List(Of)中删除项目。
我更喜欢这样做:
plot 2
但是,当我删除一个项目时,会更改该集合,并且For Next语句无法继续,并且抛出System.InvalidOperationException。
我想知道是否有任何一般方法可以正确地做到这一点,而无需编写大的解决方法。
有人可以告诉我们应该如何正确地做到这一点吗?
我附上测试代码以查看错误:
For Each nClass As SomeClass In MyList
If (Something) Then
MyList.Remove(nClass)
End If
Next
答案 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”并想要删除它,然后一次又一次地倒退直到你到达第一个项目,第一个项目仍然在同一个索引位置,所以没问题。