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
}
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.
}
}
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
}
Vous pouvez également retourner votre test if:
foreach ( int number in numbers )
{
if ( number >= 0 )
{
//process number
}
}
foreach ( int number in numbers )
{
if ( number < 0 )
{
continue;
}
//otherwise process number
}
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.
Utilisez l'instruction continue:
foreach(object o in mycollection) {
if( number < 0 ) {
continue;
}
}