Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在for each循环中删除对象_Vb.net_Loops_Object_Foreach - Fatal编程技术网

Vb.net 在for each循环中删除对象

Vb.net 在for each循环中删除对象,vb.net,loops,object,foreach,Vb.net,Loops,Object,Foreach,我正在做一个生存游戏,当一个物体从屏幕上消失时,我试着把它移走。代码如下: Public Sub tmrEnemyMove_Tick(sender As Object, e As EventArgs) Handles tmrEnemyMove.Tick Dim koopaAnimation As Boolean For Each enemy As enemy In lstEnemy enemy.enemy.Left = enemy.enemy.Left - 20

我正在做一个生存游戏,当一个物体从屏幕上消失时,我试着把它移走。代码如下:

Public Sub tmrEnemyMove_Tick(sender As Object, e As EventArgs) Handles tmrEnemyMove.Tick
    Dim koopaAnimation As Boolean

    For Each enemy As enemy In lstEnemy
        enemy.enemy.Left = enemy.enemy.Left - 20

        If enemy.enemy.Tag = "koopa" Then
            enemy.enemy.Image = Image.FromFile(Application.StartupPath + "\Graphics\koopa" + Trim(Str(koopaPosition)) + ".png")
            If koopaAnimation = False Then
                If koopaPosition = 0 Then
                    koopaPosition = 1
                Else
                    koopaPosition = 0
                End If
            End If
            koopaAnimation = True
        End If

        If picMario.Left < enemy.enemy.Left AndAlso enemy.enemy.Left < picMario.Right Or picMario.Left < enemy.enemy.Right AndAlso enemy.enemy.Right < picMario.Right Then
            If picMario.Top < enemy.enemy.Top AndAlso enemy.enemy.Top < picMario.Bottom Or picMario.Top < enemy.enemy.Bottom AndAlso enemy.enemy.Bottom < picMario.Bottom Then
                'MsgBox("Collision")
            End If
        End If

        If enemy.enemy.Left < 0 Then
            lstEnemy.Remove(enemy)
            Me.Controls.Remove(enemy.enemy)
        End If
    Next
End Sub
Public子tmrEnemyMove\u Tick(发送方作为对象,e作为事件参数)处理tmrEnemyMove.Tick
将动画设置为布尔值
每一个敌人都是敌人中的敌人
敌人。敌人。左=敌人。敌人。左-20
如果敌方。敌方。标记=“koopa”,则
敌方.敌方.Image=Image.FromFile(Application.StartupPath+“\Graphics\koopa”+修剪(Str(koopposition))+“.png”)
如果koopaAnimation=False,则
如果koopaPosition=0,则
koopaPosition=1
其他的
koopaPosition=0
如果结束
如果结束
koopaAnimation=True
如果结束
如果皮马里奥左<敌。敌。左<皮马里奥右或皮马里奥左<敌。敌。右<皮马里奥右
如果picMario.Top<敌方.敌方.Top和Also敌方.敌方.Top
我得到的错误是: mscorlib.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:集合已修改;枚举操作不能执行


如果有人能帮忙,那就太好了。谢谢。

< P>。NET真的不喜欢当你在收集内容的时候改变集合。如果您计划像这样从集合中删除元素,则可以尝试将
foreach
循环更改为
for
循环。

枚举期间无法从集合中删除对象。您根本无法修改集合。这将导致错误(集合已修改;枚举操作可能无法执行)。但您可以将要删除/删除的对象添加到另一个集合:

Dim removeEnemies = New List(Of enemy)
For Each enemy As enemy In lstEnemy
    ' ... '
    If enemy.enemy.Left < 0 Then
        removeEnemies.Add(enemy.enemy)
    End If
Next

For Each enemy In removeEnemies
    lstEnemy.Remove(enemy)
    Me.Controls.Remove(enemy.enemy)
Next
这不会引发错误,但可读性较差。您需要从
list.Count-1
转到
0
,因为您要删除会更改
Count
属性的项,并且在删除项之前可用的索引现在会导致
ArgumentOutOfRangeException

最后但并非最不重要的一点是,您可以使用:

lstneyer.RemoveAll(功能(敌方)敌方.敌方.Left<0)

一个使用实体框架(ElementAt(i))的示例:

for(int i=0;i
在循环使用集合时,您不能像这样更改集合,如果您仔细考虑的话,原因很明显。在循环中获取对对象的引用,然后删除aterWard,因此另一个选项是使用while。很好的回答
 For i As Int32 = lstEnemy.Count - 1 To 0 Step -1
    Dim enemy = lstEnemy(i)
    ' ... '
    If enemy.enemy.Left < 0 Then
        lstEnemy.Remove(enemy)
        Me.Controls.Remove(enemy.enemy)
    End If
Next
lstEnemy.RemoveAll(Function(enemy) enemy.enemy.Left < 0)
for (int i = 0; i < db.Itens.Count(); i++)
{
    Item item = db.Itens.ElementAt(i);
    if (item.Id == 0) // put a condition
    {
        db.Itens.Remove(item);
        i--;
    }
}