Должно быть просто и быстро: мне нужен 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...
}





Боюсь, что я не верю, что есть эквивалент. Вам нужно будет либо использовать логическое значение, либо просто «перейти» к концу внутренней части внешнего цикла. Это даже запутаннее, чем кажется, потому что к выражению должен быть применен ярлык, но мы не хотим здесь ничего делать. Однако я думаю, что это делает то, что вы хотите:
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: {}
}
}
}
Однако я бы рекомендовал сильно по-другому выразить это. Я не могу думать, что во многих случаях нет более удобочитаемого способа кодирования.
Немного удивительно, что в C# есть goto, но нет break/continue <label>.
C# более верен своим корням C, чем Java. Он также имеет структуры и указатели!
подождите секунду: @JonSkeet был БОЮСЬ этого? каким должен быть я в этом случае?
В VB.Net у вас может быть только один цикл while и один цикл for, а затем exit с желаемым уровнем охвата.
В C#, может быть, break;?
Это может вырваться из внутреннего цикла и позволить внешнему циклу продолжать работу.
Я думаю, вы ищете простое ключевое слово «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. Break указывает на завершение цикла, чаще всего используется, когда вы хотите остановить обработку при выполнении условия.
Я надеюсь, что это дает вам то, что вы искали, но если нет, не стесняйтесь спросить еще раз.
спасибо, но я знаю разницу между продолжением и разрывом. ;-) Дело в том, что у меня два вложенных цикла. и если во внутреннем цикле возникает определенное условие, я хочу «продолжить» внешний цикл.
Извините - я не хотел научить вас сосать яйца - Я виноват в том, что не прочитал вопрос должным образом ...
Вы можете сделать что-то вроде:
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*/
}
}
проблема здесь в том, что остальная часть кода находится ПОСЛЕ вложенного цикла, а не в нем.
Ой, я только что заметил в моем первом примере, что у меня была неправильная строка для комментария «// здесь код». Извините.
Вы можете просто установить флаг перед взломом и проверить флаг после цикла. И если вы действительно хотите, чтобы ваш код был формально «структурирован», вы устанавливаете j = bar.Length вместо использования break.
j = bar.Length запустит текущий цикл до конца, это не то, что предполагается;)
Другая возможность - создать функцию с внутренним циклом:
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;
}
Мне это больше нравится, потому что такие циклы в функциях часто имеют собственную хорошую семантику (=> хорошее имя) и поэтому могут использоваться повторно.
Надежда умирает последней: github.com/dotnet/csharplang/issues/869, а здесь visualstudio.uservoice.com/forums/121579-visual-studio-ide/… (хотя голосовать нельзя).