С# эквивалентно Java continue <label>?

Должно быть простым и быстрым: я хочу эквивалент С# для следующего кода Java:

orig: for(String a : foo) {
  for (String b : bar) {
    if (b.equals("buzz")) {
      continue orig;
    }
  }
  // other code comes here...
}

Edit: ОК, похоже, нет такого эквивалента (эй - сам Джон Скит сказал, что нет, это его решает;)). Поэтому "решение" для меня (в его эквиваленте Java):

for(String a : foo) {
  bool foundBuzz = false;
  for (String b : bar) {
    if (b.equals("buzz")) {
      foundBuzz = true;
      break;
    }
  }
  if (foundBuzz) {
    continue;
  }
  // other code comes here...
}

Ответ 1

Я не думаю, что есть эквивалент, я боюсь. Вам придется либо использовать логическое, либо просто "перейти" к концу внутренней части внешнего цикла. Это даже более беспорядочно, чем кажется, поскольку ярлык должен применяться к заявлению, но мы не хотим ничего делать здесь. Однако я думаю, что это делает то, что вы хотите:

using System;

public class Test
{
    static void Main()
    {
        for (int i=0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
               Console.WriteLine("i={0} j={1}", i, j);
               if (j == i + 2)
               {
                   goto end_of_loop;   
               }
            }
            Console.WriteLine("After inner loop");
            end_of_loop: {}
        }
    }
}

Я бы настоятельно рекомендовал другой способ выразить это. Я не могу думать, что есть много раз, когда нет более читаемого способа его кодирования.

Ответ 2

Другая возможность - сделать функцию с внутренним циклом:

void mainFunc(string[] foo, string[] bar)
{
  foreach (string a in foo)
    if (hasBuzz(bar))
      continue;
  // other code comes here...
}

bool hasBuzz(string[] bar)
{
  foreach (string b in bar)
    if (b.equals("buzz"))
      return true;
  return false;
}

Ответ 3

В VB.Net вы можете просто иметь один цикл while и один цикл for, а затем exit желаемый уровень видимости.

В С#, возможно, break;?

Это может вырваться из внутреннего цикла и позволить внешнему циклу продолжать работу.

Ответ 4

Я думаю, что вы ищете простое ключевое слово "продолжить"... Однако, не будучи Java-парнем, я действительно не понимаю, чего пытается достичь фрагмент кода.

Однако рассмотрим следующее.

foreach(int i in new int[] {1,2,3,5,6,7})
{
    if(i % 2 == 0)
        continue;
    else
        Console.WriteLine(i.ToString());    
}

Оператор continue в строке 4 является инструкцией для продолжения цикла при следующем значении. Выходной сигнал здесь будет 1,3,5 и 7.

Замена "continue" на "break", как показано ниже,

foreach(int i in new int[] {1,2,3,5,6,7})
{
    if(i % 2 == 0)
       break;
    else
        Console.WriteLine(i.ToString());    
}

будет выдавать результат 1. Break указывает, что цикл завершается, чаще всего используется, когда вы хотите прекратить обработку при выполнении условия.

Надеюсь, это даст вам то, что вы искали, но если нет, не стесняйтесь спрашивать снова.

Ответ 5

Вы можете сделать что-то вроде:

for(int i=0; i< foo.Length -1 ; i++) {
  for (int j=0; j< bar.Length -1; j++) {
    if (condition) {
      break;
    }
    if(j != bar.Length -1)
        continue;
    /*The rest of the code that will not run if the previous loop doesn't go all the way*/
  }
}