Как пропустить итерацию цикла foreach?

В Perl я могу пропустить итерацию foreach (или любого цикла) командой next;.

Есть ли способ пропустить итерацию и перейти к следующему циклу в С#?

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

     // otherwise process number
 }

Ответ 1

Вы хотите:

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

    // do work
}

Подробнее о continue ключевое слово.


Обновление: В ответ на следующий вопрос Брайана в комментариях:

Не могли бы вы уточнить, что я буду делать, если бы я вложил петли и хотел пропустить повторение одной из расширенных?

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

A continue всегда применяется к ближайшей охватывающей области, поэтому вы не можете использовать его для выхода из внешнего цикла. Если возникает такое условие, вам нужно сделать что-то более сложное в зависимости от того, что вы хотите, например break от внутреннего цикла, а затем continue во внешнем цикле. См. Здесь документацию по break ключевое слово. Ключевое слово break С# похоже на ключевое слово Perl last.

Также подумайте о том, чтобы принять предложение Дастина просто отфильтровать значения, которые вы не хотите обрабатывать заранее:

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.
  }
}

Ответ 2

Другим подходом является фильтрация с использованием LINQ до выполнения цикла:

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

Ответ 3

Вы также можете перевернуть свой тест if:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }

Ответ 4

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

    //otherwise process number
}

Ответ 5

Другой подход, использующий linq:

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

Если вы хотите пропустить первый из нескольких элементов.

Или используйте .SkipWhere, если вы хотите указать условие для пропуска.

Ответ 6

Вы можете использовать оператор continue.

Например:

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

Ответ 7

Используйте оператор continue:

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

Ответ 8

Самый простой способ сделать это, как показано ниже:

//Skip First Iteration

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

//Skip any other like 5th iteration

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