tags:

views:

3183

answers:

6

In Perl I can skip a foreach (or any loop) iteration with a next; command.

Is there a way to skip over an iteration and jump to the next loop in C#?

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

     // otherwise process number
 }
+8  A: 
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}
DrJokepu
+40  A: 

You want:

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

    // do work
}

Here's more about the continue keyword.


Update: In response to Brian's follow-up question in the comments:

Could you further clarify what I would do if I had nested for loops, and wanted to skip the iteration of one of the extended ones?

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

A continue always applies to the nearest enclosing scope, so you couldn't use it to break out of the outermost loop. If a condition like that arises, you'd need to do something more complicated depending on exactly what you want, like break from the inner loop, then continue on the outer loop. See here for the documentation on the break keyword.

Also, consider taking Dustin's suggestion to just filter out values you don't want to process beforehand:

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.
  }
}
John Feminella
Could you further clarify what I would do if I had nested for loops, and wanted to skip the iteration of one of the extended ones?ex:for (int[] numbers in numberarrays) { for (int number in numbers) { //What to do if want to jump the (numbers/numberarrays) }}
Brian
+1 - Nom nom nom indeed!
Kev
love the ascii art. +1
Jonathan C Dickinson
+5  A: 

Use the continue statement:

foreach(object o in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }
drewh
-1 for the curly brackets in the wrong spot... (kidding of course)
Greg Dean
+4  A: 

You can use the continue statement.

For example:

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

HTH
Kev

Kev
+9  A: 

You could also flip your if test:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }
crashmstr
:) Thanks! I come up with a basic example because there were some criteria in the beginning of the loop that wouldn't need to be processed, and others that were errors that needed to be caught.
Brian
+1 for not using 'continue'
Trap
+12  A: 

Another approach is to filter using LINQ before the loop executes:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}
Dustin Campbell
+1. Although it's not a direct response to the question, in practice I'd probably prefer this solution to the one I proposed. Using LINQ seems like a good general use case for filtering out loop values you don't want to process.
John Feminella
+1 Indeed a very elegant solution.
Trap