InvalidOperationException VB.Net泛型集合?

InvalidOperationException VB.Net泛型集合?,vb.net,collections,iteration,Vb.net,Collections,Iteration,我知道修改您正在迭代的集合通常是一个很大的禁忌,但不幸的是,我没有设计我试图修改的代码。在所有地方,都要执行以下操作: for each log in Logs logs.Delete(log.LogId) Next Delete几乎只是从数据库中删除日志并将其从集合中删除。以前,Logs对象使用的是非泛型集合。我将其更改为使用(日志)集合,以便可以LINQify该对象。现在,每次我调用next/.MoveNext时,在第一次删除后都会调用以下错误: 无效操作例外: “集合已修改;枚举操

我知道修改您正在迭代的集合通常是一个很大的禁忌,但不幸的是,我没有设计我试图修改的代码。在所有地方,都要执行以下操作:

for each log in Logs
   logs.Delete(log.LogId)
Next
Delete几乎只是从数据库中删除日志并将其从集合中删除。以前,Logs对象使用的是非泛型集合。我将其更改为使用(日志)集合,以便可以LINQify该对象。现在,每次我调用next/.MoveNext时,在第一次删除后都会调用以下错误: 无效操作例外: “集合已修改;枚举操作可能无法执行。”


我理解为什么会出现错误,但我不理解为什么非通用版本从未出现过错误。有没有办法绕过这个错误?我真的不可能花时间去改变删除日志的每个地方,就像这样(代码库很大)。我只想删除Delete函数中的代码,在该函数中将其从当前集合中删除,因为我假设在集合完成后没有代码对其执行任何操作,但您知道当您假设时会发生什么。

您的问题简而言之:

        Collection<object> stuff = new Collection<object> { 1, 2, 3, 4 };

        foreach (var o in stuff)
            stuff.Remove(o); // causes exception
  • 向后迭代集合

        for (int i = stuff.Count - 1; i >= 0; i--)
            stuff.RemoveAt(i); // does not cause exception
    
    (这类似于
    logs.Delete(logs[i].LogId);


  • 关于C#很抱歉,但是概念非常清楚

    集合(T的)
    中删除所有条目不需要循环,只需使用该方法即可

    Logs.Clear
    

    Charles的回应让我想到创建一个副本,而不是遍历真实的集合。不幸的是,他的解决方案需要更改删除了所有活动日志的代码。下面是我如何修复这个似乎运行良好的问题(Psuedocode):

    之前:

    Public Function GetEnumerator() as IEnumerator
        Return col.GetEnumerator
    End Function
    
    之后:

    Public Function GetEnumerator() As IEnumerator
        Return col.ToList().GetEnumerator()
    End Function
    

    您是否在“非通用”实现中使用FOR EACH?是的,日志总是以这种方式删除的。只是不明白为什么以前没有例外。什么是非泛型集合类型?不用担心C中的示例,这实际上是我喜欢的,但我的雇主选择了vb.net:)。无论如何,谢谢你的回复,因为尽管修复程序与你在帖子上面的不完全一样,但当你说“创建一个副本”时我开始思考,所以我只是将GetEnumerator函数从:Return GetEnumerator改为:Return GetEnumerator.ToList().GetEnumerator,它工作得很好。
    Public Function GetEnumerator() As IEnumerator
        Return col.ToList().GetEnumerator()
    End Function