Comment puis-je ignorer une itération d'une boucle `foreach`?

En Perl, je peux ignorer une itération foreach (ou n'importe quelle boucle) avec une commande next;.

Existe-t-il un moyen de sauter une itération et de passer à la boucle suivante en C#?

 foreach (int number in numbers)
 {
     if (number < 0)
     {
         // What goes here to skip over the loop?
     }

     // otherwise process number
 }
263
demandé sur Brian 2009-03-17 15:58:22

7 réponses

Vous voulez:

foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

Voici plus d'informations sur la continue mot-clé.


Mise à jour: en réponse à la question de suivi de Brian dans les commentaires:

Pourriez-vous clarifier davantage ce que je ferais si j'avais imbriqué des boucles, et que je voulais ignorer l'itération de l'une des boucles étendues?

for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}

Un continue s'applique toujours à la portée englobante la plus proche, de sorte que vous ne pouvez pas l'utiliser pour sortir de la boucle la plus externe. Si un une telle condition se pose, vous devez faire quelque chose de plus compliqué en fonction de ce que vous voulez exactement, comme break de la boucle interne, puis continue sur la boucle externe. Voir ici pour la documentation sur le break mot-clé. Le mot-clé break C# est similaire au mot-clé Perl last.

Aussi, pensez à prendre la suggestion de Dustin pour simplement filtrer les valeurs que vous ne voulez pas traiter à l'avance:

foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}
549
répondu John Feminella 2012-05-04 07:46:08

Une autre approche consiste à filtrer en utilisant LINQ avant l'exécution de la boucle:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}
47
répondu Dustin Campbell 2009-03-17 13:35:19

Vous pouvez également retourner votre test if:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }
24
répondu crashmstr 2009-03-17 13:02:22
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}
17
répondu Tamas Czinege 2009-03-17 12:59:49

Une autre approche utilisant linq est:

foreach ( int number in numbers.Skip(1))
{   
    // process number  
}

Si vous voulez sauter le premier dans un certain nombre d'éléments.

Ou utilisez .SkipWhere si vous voulez spécifier une condition pour sauter.

13
répondu Edmund Covington 2014-09-17 08:36:10

Vous pouvez utiliser le continue l'énoncé.

Par exemple:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}
12
répondu Kev 2011-07-26 20:51:21

Utilisez l'instruction continue:

foreach(object o in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }
7
répondu drewh 2009-03-17 13:00:24