Как пропустить итерацию цикла `foreach`? - PullRequest
288 голосов
/ 17 марта 2009

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

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

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

     // otherwise process number
 }

Ответы [ 7 ]

595 голосов
/ 17 марта 2009

Вы хотите:

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 C # аналогично ключевому слову 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.
  }
}
51 голосов
/ 17 марта 2009

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

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}
24 голосов
/ 17 марта 2009

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


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }
17 голосов
/ 17 марта 2009
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}
15 голосов
/ 06 декабря 2013

Другой подход с использованием linq:

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

Если вы хотите пропустить первый в ряде пунктов.

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

12 голосов
/ 17 марта 2009

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

Например:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}
7 голосов
/ 17 марта 2009

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

foreach(object o in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...