0
votes

Impossible de supprimer l'élément de la liste en C #

Dans l'inventaire de mon jeu, je souhaite supprimer un élément si vous le déposez. Cela ne fonctionne que dans une boucle foreach comme ceci: xxx

mais je reçois cette erreur:

la collection a été modifiée; L'opération de dénombrement peut ne pas exécuter.

Quand j'essaye juste ceci: xxx

Rien ne se passe. Est-ce que quelqu'un sait comment résoudre ce problème?


4 commentaires

Vous n'avez pas besoin d'une boucle. Il suffit de le supprimer s'il existe dans la liste. Je ne vois pas non plus de différence dans les deux extraits postés


@Samikuhmonen Désolé, j'ai oublié de changer le 2e code. Sans une boucle, cela ne fonctionne pas pour une raison quelconque, savez-vous pourquoi?, Savez-vous peut-être peut-être corriger cette erreur: l'opération d'énumération peut ne pas exécuter.


Êtes-vous sûr que l'élément n'existe qu'une fois dans votre liste? Vérifiez si la méthode Supprimer renvoie true ou false ou vérifier les éléments.count () avant et après la suppression.


Cette question n'a rien à voir avec Unityscript


3 Réponses :


6
votes

Pour supprimer un élément d'une liste, il suffit de le faire:

public void DeleteItem(Item itemToRemove) 
{
  items.Remove(itemToRemove);
}


3 commentaires

J'ai déjà essayé cela et rien ne s'est passé, vous savez peut-être peut-être corriger l'erreur, car mon script fonctionne, seule l'erreur est très gênante. Oh, et comment vérifiez-vous la valeur de retour?


Vérifiez la valeur de retour de items.remove . Si c'est faux , l'élément n'était pas dans la liste. Aussi, assurez-vous que vous essayez réellement de supprimer le même instance d'un élément, plutôt que d'une nouvelle instance qui se trouve avoir les mêmes valeurs.


Merci pour votre aide, mais j'ai oublié un autre script, c'est pourquoi cela n'a pas fonctionné.



3
votes

Cette erreur indique que vous modifiez une collection en même temps que vous en boucle. Ceci est dangereux car une fois que la collecte change, l'état Itérateur ne peut plus être valide. Par exemple, l'itérateur pourrait indiquer à l'index 3 dans une liste, mais si vous supprimez l'élément 0 (survolant tout ce qui est en arrière), vous finiriez de sauter à l'avance. Lancer cette erreur évite ce type de bug subtil en le rendant évident.

Dans ce cas particulier, vous n'avez pas besoin d'une boucle: retirez simplement l'article.

Si vous souhaitez faire un élimination en vrac, envisagez des méthodes telles que RemoveAll.

Une autre option consiste à boucler sur une copie de la liste, ce qui vous laisse libre de le modifier. Par exemple, vous pouvez boucler sur les articles.Tearray ().


0 commentaires

1
votes

Il y avait un autre script attaché qui a ajouté directement l'élément si j'ai laissé tomber le pistolet, de sorte que c'était l'erreur.


0 commentaires