C # эквивалентно продолжению Java <label>? - PullRequest
28 голосов
/ 11 декабря 2008

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

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

Редактировать : ОК, похоже, такого эквивалента нет (эй, - сам Джон Скит сказал, что нет, это решает вопрос;)). Таким образом, «решение» для меня (в 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...
}

Ответы [ 5 ]

31 голосов
/ 11 декабря 2008

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

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: {}
        }
    }
}

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

9 голосов
/ 15 февраля 2011

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

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;
}
2 голосов
/ 11 декабря 2008

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

В C #, может быть break;?

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

0 голосов
/ 11 декабря 2008

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

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*/
  }
}
0 голосов
/ 11 декабря 2008

Я думаю, вы ищете простое ключевое слово "continue" ... Однако, не будучи 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.

Заменить «продолжить» на «перерыв» следующим образом:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...