我正在制作一个生存游戏并尝试在屏幕离开时删除它。这是代码:
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”类型异常 附加信息:收集已修改;枚举操作可能无法执行。
如果有人能提供帮助那就太棒了,谢谢。
答案 0 :(得分:15)
在枚举期间无法从集合中删除对象。您根本无法修改集合。这将导致错误(集合已被修改;枚举操作可能无法执行)。但是您可以将要删除/删除的对象添加到另一个集合中:
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
这些方法会导致列表更改其版本(在枚举期间检查):
另一种选择是使用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 - 1
转到0
,因为您要删除会更改Count
属性的项目以及在删除项目之前可用的索引现在导致{{1} }。
最后但并非最不重要的是,您可以使用List.RemoveAll
:
ArgumentOutOfRangeException
答案 1 :(得分:1)
foreach
循环更改为for
循环。
答案 2 :(得分:0)
使用实体框架(ElementAt(i))的一个例子:
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--;
}
}