C # эквивалентно продолжению Java

Должно быть просто и быстро: я хочу 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...
}
11.12.2008 14:01:54
Надежда умирает последней: github.com/dotnet/csharplang/issues/869 и здесь visualstudio.uservoice.com/forums/121579-visual-studio-ide/… (не могу голосовать, хотя).
greenoldman 2.01.2019 20:10:52
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

34
11.12.2008 14:05:10
Немного удивительно, что в C # есть goto, но нет break/continue <label>.
Rok Strniša 14.06.2013 16:02:15
C # более верен своим корням C, чем Java. У этого также есть структуры и указатели!
Chris Rollins 5.10.2016 06:11:59
секундочку: @JonSkeet был БОИТСЯ это? как мне быть в этом случае?
tetri 26.07.2018 20:35:53

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

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

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

2
11.12.2008 14:07:41

Я думаю, что вы ищете простое ключевое слово "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. Прерывание дает команду завершить цикл, наиболее часто используемый, когда вы хотите остановить обработку при выполнении условия.

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

0
11.12.2008 14:25:45
спасибо, но я знаю разницу между продолжением и перерывом. ;-) дело в том, что у меня есть два вложенных цикла. и если возникает определенное условие во внутреннем цикле, я хочу «продолжить» внешний цикл.
Epaga 11.12.2008 14:44:39
Извините - не хотел учить вас сосать яйца - Я виноват в том, что не прочитал вопрос адекватно ...
ZombieSheep 11.12.2008 16:56:10

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

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.12.2008 14:27:31
проблема здесь в том, что остальная часть кода ПОСЛЕ вложенного цикла, а не в нем.
Epaga 11.12.2008 14:45:19
упс, я только что заметил в моем первом примере, у меня была неправильная строка для комментария "// код здесь". Извините.
Epaga 11.12.2008 14:46:57
Вы можете просто установить флаг перед разрывом и проверить флаг после цикла. И если вы действительно хотите, чтобы ваш код был формально «структурирован», вы устанавливаете j = bar.Length, а не «break».
Joel Coehoorn 11.12.2008 14:57:06
j = bar.Longth будет запускать текущий цикл до конца, это не то, что задумано;)
Sergio 7.01.2009 18:14:20

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

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;
}
10
15.02.2011 16:43:17
Мне это нравится больше, потому что такие циклы в функциях часто имеют собственную семантику (=> хорошее имя) и, следовательно, могут быть использованы повторно.
Spoc 26.02.2017 16:51:29