“收藏品被修改了;” ......但事实并非如此

时间:2013-03-29 19:57:22

标签: vb.net collections

我有一个对象列表:

Dim objList As BindingList(Of Object1)

其中每个都包含Object2列表。我试图遍历objList,以便我可以从每个Object1的相应Object2列表中删除Object2的特定实例:

For Each obj In objList
    Dim objRemove = obj.Object2List.Where(AddressOf ObjCheck)
    For Each obj2 In objRemove
        obj.Object2List.Remove(obj2)
    Next
Next

这会抛出错误,“集合已被修改;枚举操作可能无法执行。”

我不明白的是我从Object2List中删除了一个未被枚举的对象。为什么会抛出这个错误?

2 个答案:

答案 0 :(得分:1)

调用Where实际上并不执行查询并创建新集合。它只是创建一个迭代器,它迭代原始列表,跳过与查询不匹配的元素。

您需要添加对ToList()的调用以立即执行查询并创建新的项目集合:

Dim objRemove = obj.Object2List.Where(AddressOf ObjCheck).ToList()

答案 1 :(得分:0)

在这种情况下,您只是间接地枚举Object2ListobjRemove集合内部包含对Object2List的引用,枚举objRemove将隐式枚举Object2List

解决此问题的最简单方法是按索引枚举集合

Dim index = 0
Dim list = obj.Object2List
While index < list.Count
  If ObjCheck list(index) Then
    list.RemoveAt(index)
  Else
    index = index + 1
End