C# эквивалентно продолжению <label> в 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...
}

Надежда умирает последней: github.com/dotnet/csharplang/issues/869, а здесь visualstudio.uservoice.com/forums/121579-visual-studio-ide/… (хотя голосовать нельзя).

greenoldman 02.01.2019 23:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
33
1
16 026
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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: {}
        }
    }
}

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

Немного удивительно, что в C# есть goto, но нет break/continue <label>.

Rok Strniša 14.06.2013 20:02

C# более верен своим корням C, чем Java. Он также имеет структуры и указатели!

Chris Rollins 05.10.2016 09:11

подождите секунду: @JonSkeet был БОЮСЬ этого? каким должен быть я в этом случае?

tetri 26.07.2018 23:35

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

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

спасибо, но я знаю разницу между продолжением и разрывом. ;-) Дело в том, что у меня два вложенных цикла. и если во внутреннем цикле возникает определенное условие, я хочу «продолжить» внешний цикл.

Epaga 11.12.2008 17:44

Извините - я не хотел научить вас сосать яйца - Я виноват в том, что не прочитал вопрос должным образом ...

ZombieSheep 11.12.2008 19:56

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

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*/
  }
}

проблема здесь в том, что остальная часть кода находится ПОСЛЕ вложенного цикла, а не в нем.

Epaga 11.12.2008 17:45

Ой, я только что заметил в моем первом примере, что у меня была неправильная строка для комментария «// здесь код». Извините.

Epaga 11.12.2008 17:46

Вы можете просто установить флаг перед взломом и проверить флаг после цикла. И если вы действительно хотите, чтобы ваш код был формально «структурирован», вы устанавливаете j = bar.Length вместо использования break.

Joel Coehoorn 11.12.2008 17:57

j = bar.Length запустит текущий цикл до конца, это не то, что предполагается;)

Sergio 07.01.2009 21:14

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

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;
}

Мне это больше нравится, потому что такие циклы в функциях часто имеют собственную хорошую семантику (=> хорошее имя) и поэтому могут использоваться повторно.

Spoc 26.02.2017 19:51

Другие вопросы по теме