8
votes

Modification de la collection lors de l'utilisation d'une boucle de foresach en C #

Fondamentalement, je voudrais supprimer un élément d'une liste tandis que dans la boucle de Foreach. Je sais que cela est possible lors de l'utilisation d'une boucle pour boucle, mais à d'autres fins, je voudrais savoir si cela est réalisable à l'aide d'une boucle de foresach.

dans Python, nous pouvons y parvenir en procédant comme suit: P> xxx pré>

ceci donne la sortie suivante p> xxx pré>

mais lorsque vous faites quelque chose de similaire dans C #, je reçois une exception invalide, je me demandais s'il y avait un manière de se déplacer cela, sans simplement utiliser simplement une boucle b>. p>

Le code en C # que j'ai utilisé lorsque l'exception a été lancée: P>

static void Main(string[] args)
  {
  List<string> MyList = new List<string>(new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9"});

  foreach (string Item in MyList)
    {
    if (MyList.IndexOf(Item) == 0)
      {
      MyList.RemoveAt(1);
      }

    Console.WriteLine(Item);
    }
  }


0 commentaires

3 Réponses :


26
votes

Vous ne pouvez pas faire cela. De la documents pour ienumerator :

Un énumérateur reste valable aussi longtemps que La collection reste inchangée. Si Les changements sont faits à la collection, comme l'ajout, la modification ou la suppression éléments, l'énumérateur est irrécupérablement invalidée et sa le comportement est indéfini.

Les alternatives sont:

  • Construisez une nouvelle liste d'éléments à supprimer, puis supprimez-les ensuite
  • Utilisez une boucle normale "pour" et assurez-vous de vous aider à ne pas aller sur le même élément deux fois ou ne vous manque pas. (Vous avez dit que vous ne voulez pas faire cela, mais ce que vous essayez de faire pour ne pas travailler.)
  • Construisez une nouvelle collection contenant uniquement les éléments que vous souhaitez conserver

    La dernière de ces alternatives est la solution de type Linq, où vous écririez généralement: xxx

    (où devrait être dû Est quelle que soit la logique que vous voulez, bien sûr.) L'appel à tolist () n'est nécessaire que si vous le souhaitez réellement dans une liste. Cela conduit à plus de code déclaratif qui est souvent plus facile à lire. Je ne peux pas facilement deviner ce que votre boucle d'origine est censée faire (il semble assez étrange pour le moment) alors que si vous pouvez exprimer la logique purement en termes d'élément, cela peut être beaucoup plus clair.


1 commentaires

Je me demandais principalement si j'avais manqué quelque chose quelque part avec le cas de Toueach, mais si ce n'est pas réalisable, au moins cela est maintenant confirmé! Merci d'avoir répondu



1
votes

Vous ne pouvez certainement pas modifier une collection de quelque manière que ce soit lorsque vous utilisez une boucle foreach sur elle.

Vous pouvez utiliser A pour boucle et gérer l'index pour vous-même ou faire une copie de la collection et en boucle de l'original, supprimez les éléments de la copie correspondant à l'élément de l'original.

Dans les deux cas, ce n'est pas aussi clair ou pratique :).


0 commentaires

6
votes

Si tout ce dont vous avez besoin est de supprimer tous les éléments satisfaisant à une condition, vous pouvez utiliser le Liste .RemoveAll Méthode: xxx

Notez que cela modifie la liste initiale.


0 commentaires