当前位置: 首页 > 知识库问答 >
问题:

“集合已修改;”。。。但事实并非如此

史钊
2023-03-14

我有一个对象列表:

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个答案

卫学真
2023-03-14

在这种情况下,您只是间接枚举Object2List。集合内部包含对Object2List的引用,枚举Object2List也会隐式枚举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
计燕七
2023-03-14

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

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

Dim objRemove = obj.Object2List.Where(AddressOf ObjCheck).ToList()
 类似资料:
  • 我正在从一个可观察的列表中设置一个ListView,该列表有另一个集合的输入(在本例中是一个链表)。因此,我在这个答案中找到了如何使列表视图的项从中移除(我不太确定它们是否也从ObservableList中移除),那么还有什么可能的方法可以在两个集合(即ObservableList和原始集合)中进行修改呢? 下面是一段代码:

  • 合并 在执行pull之后,进行下一次push之前,如果其他人进行了推送内容到远程数据库的话,那么你的push将被拒绝。 这种情况下,在读取别人push的变更并进行合并操作之前,你的push都将被拒绝。这是因为,如果不进行合并就试图覆盖已有的变更记录的话,其他人push的变更(图中的提交C)就会丢失。 合并的时候,Git会自动合并已有的变更点!不过,也存在不能自动合并的情况。在下一个页面,我们会为大

  • 尝试添加到集合时出现“Collection was modified”异常 问题出在“添加”方法上。如果我注释掉该部分,则不会引发异常。重要的是要注意,我已经尝试将foreach重写为for循环并添加“ToList()”以形成。链接。在所有情况下都会引发相同的异常。我在站点的其他部分使用这种完全相同的模式没有问题,这就是为什么这如此令人沮丧。这也适用于“创建”。问题只影响“编辑”操作。 其他相关代

  • 问题内容: 假设我有一个Integer列表,并且我在列表上使用Java 8 forEach方法将其值加倍。说我有以下代码: 至于forEach方法,请使用Consumer并调用它接受方法。我在上面的代码运行后打印列表,原始列表没有变化。 据我了解,Stream不会改变源,但在这里我只是在每个元素上调用accept方法。 谢谢你在advace 问题答案: forEach不更改列表的原因归结为规范:

  • 我已经解决了如何合并两个XML文件并修改匹配的属性。 我现在正在努力解决如果file1中不存在file2节点,如何添加file2节点(基于属性名) 这是我拥有的xsl文件: 我找到了如何使用XSLT合并两个xml文件,但无法解决如何将提议解决方案应用于我的xsl。有人能帮忙吗?

  • 问题内容: 我在下面有此代码,并且通过执行以下行来获取ConcurrentModificationException: 代码: 堆栈是: 恰好在foreach行上: 我不明白为什么会发生此错误,因为我没有修改列表。 问题答案: 要知道,是 不是抄袭 收集数据,但只有包装原始集合在一个特殊的包装。因此,如果您修改原始集合,则会出现此错误。 如果要创建真正独立的不可修改的集合实例: