gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:31:50 26 4
gpt4 key购买 nike

我正在制作一个生存游戏并试图在它离开屏幕时移除一个物体。这是代码:

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

我得到的错误是:
mscorlib.dll 中发生类型为“System.InvalidOperationException”的未处理异常
附加信息:集合已修改;枚举操作可能无法执行。

如果有人可以提供帮助,那就太好了,谢谢。

最佳答案

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

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

以下所有方法都会导致列表更改其版本(在枚举期间检查):
  • 添加
  • 清除
  • 插入
  • 插入范围
  • 删除
  • 移除范围
  • 移除在
  • 反向
  • [Indexer setter]
  • 排序

  • 另一种选择是使用 For-Loop并向后循环:
     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

    这不会引发该错误,但它的可读性较差。您需要从 list.Count - 10因为你想删除会改变 Count 的项目删除项目之前可用的属性和索引现在会导致 ArgumentOutOfRangeException .

    最后但并非最不重要的是,您可以使用 List.RemoveAll :
    lstEnemy.RemoveAll(Function(enemy) enemy.enemy.Left < 0)

    关于vb.net - 在 for each 循环中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734186/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com