2

I have a list of objects:

Dim objList As BindingList(Of Object1)

Each of those contains a list of Object2. I am trying to iterate through objList so that I can remove specific instances of Object2 from each Object1's respective Object2 list:

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

This throws the error, "Collection was modified; enumeration operation may not execute."

What I don't understand is that I am removing an object from Object2List, which is not being enumerated. Why is this error being thrown?

4

2 に答える 2

1

呼び出しWhereは、実際にクエリを実行して新しいコレクションを作成するわけではありません。クエリに一致しない要素をスキップして元のリストを反復処理する反復子を作成するだけです。

ToList()クエリをすぐに実行してアイテムの新しいコレクションを作成するには、への呼び出しを追加する必要があります。

Dim objRemove = obj.Object2List.Where(AddressOf ObjCheck).ToList()
于 2013-03-29T20:00:47.167 に答える
0

この場合、Object2List間接的に列挙しています。コレクションはobjRemove内部的に参照を保持し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
于 2013-03-29T20:01:10.770 に答える