2

我有一个对象列表:

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 中删除一个对象,该对象没有被枚举。为什么会抛出这个错误?

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 回答