Je fais un jeu de survie et j'essaie de supprimer un objet lorsqu'il sort de l'écran. Voici le code:
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
3 Réponses :
.net ne l'aime vraiment pas lorsque vous modifiez une collection lorsque vous êtes au milieu de l'énumération de son contenu. Vous pouvez essayer de modifier votre foreach code> en boucle code> pour code> en boucle si vous envisagez de supprimer des éléments de la collection comme celle-ci. P>
Vous ne pouvez pas supprimer un objet d'une collection lors de l'énumération. Vous ne pouvez pas du tout modifier la collection. Cela provoquera une erreur ( la collection a été modifiée; l'opération de dénombrement peut ne pas exécuter em>). Mais vous pouvez ajouter les objets que vous souhaitez supprimer / supprimer à une autre collection: Une autre option consiste à utiliser un Cela ne posera pas cette erreur mais Ce n'est pas aussi lisible. Vous devez partir de dernier mais non le moindre, vous pouvez utiliser lstEnemy.RemoveAll(Function(enemy) enemy.enemy.Left < 0)
pour la boucle code> et la boucle en arrière: p>
list.count - 1 code> à
0 code> car vous souhaitez supprimer des éléments qui modifieraient la propriété
comptent code> et un index qui était Disponible avant que l'élément ait été supprimé des causes maintenant un
argumentoutofrangeException code>. p>
list.removeall code>
: p> 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
Une autre option est d'utiliser un certain temps. très bonne réponse
Un exemple avec cadre d'entité (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--; } }
Vous ne pouvez pas changer la collection comme celle-ci tout en bouclant, pour des raisons évidentes si vous y réfléchissez. Obtenez une référence à l'objet lors de la boucle, puis supprimez ensuite