我有一个对象列表:
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中删除了一个未被枚举的对象。为什么会抛出这个错误?
答案 0 :(得分:1)
调用Where
实际上并不执行查询并创建新集合。它只是创建一个迭代器,它迭代原始列表,跳过与查询不匹配的元素。
您需要添加对ToList()
的调用以立即执行查询并创建新的项目集合:
Dim objRemove = obj.Object2List.Where(AddressOf ObjCheck).ToList()
答案 1 :(得分: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