web-dev-qa-db-fra.com

Comment sauter 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;.

Y a-t-il un moyen de sauter une itération et de sauter à la prochaine boucle en C #?

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

     // otherwise process number
 }
293
Brian

Tu veux:

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

    // do work
}

Voici plus sur le continue mot-clé .


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

Pourriez-vous préciser davantage ce que je ferais si j'avais niché pendant des boucles et si je voulais ignorer l'itération de l'une d'elles é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, vous ne pouvez donc pas l'utiliser pour sortir de la boucle la plus externe. Si une telle condition se présente, vous devrez faire quelque chose de plus compliqué en fonction de ce que vous voulez, comme break dans la boucle interne, puis continue dans 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.

En outre, envisagez de prendre la suggestion de Dustin pour filtrer uniquement les valeurs que vous ne souhaitez pas traiter au préalable:

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.
  }
}
606
John Feminella

Une autre approche consiste à filtrer à l'aide de LINQ avant que la boucle ne s'exécute:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}
53
Dustin Campbell

Vous pouvez également retourner votre si test:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }
24
crashmstr
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}
17
Tamas Czinege

Une autre approche utilisant linq est:

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

Si vous souhaitez ignorer le premier élément de plusieurs éléments.

Ou utilisez .SkipWhere si vous souhaitez spécifier une condition à ignorer.

16
Edmund Covington

Vous pouvez utiliser l'instruction continue .

Par exemple:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}
13
Kev

Utilisez l'instruction continue:

foreach(object o in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }
7
drewh

La façon la plus simple de le faire est la suivante:

//Skip First Iteration

foreach ( int number in numbers.Skip(1))

//Skip any other like 5th iteration

foreach ( int number in numbers.Skip(5))
0
Kashif