Подтвердить что ты не робот

Есть ли эквивалент разметки, помеченной Java в С#, или обходной путь

Я конвертирую некоторый Java-код в С# и обнаружил несколько помеченных инструкций "break" (например.)

label1:
    while (somethingA) {
       ...
        while (somethingB) {
            if (condition) {
                break label1;
            }
        }
     }

Есть ли эквивалент в С# (текущее чтение не указывает на него), и если нет другого преобразования, кроме (скажем), имеющего флаги bool, чтобы указать, следует ли прерывать каждый конец цикла (например)

bool label1 = false;
while (somethingA)
{
   ...
    while (somethingB)
    {
        if (condition)
        {
            label1 = true;
            break;
        }
    }
    if (label1)
    {
        break;
    }
}
// breaks to here

Мне было бы интересно, почему С# не имеет этого, поскольку это не кажется очень злым.

4b9b3361

Ответ 1

Вы можете просто использовать goto, чтобы перейти непосредственно к метке.

while (somethingA)
{
    // ...
    while (somethingB)
    {
        if (condition)
        {
            goto label1;
        }
    }
}
label1:
   // ...

В C-подобных языках goto часто оказывается чистым для взлома вложенных циклов, в отличие от отслеживания логических переменных и повторной проверки их в конце каждого цикла.

Ответ 2

Рефакторинг - лучший ответ, если у вас есть достаточная сложность в функции, которую нужно вырвать из двух таких циклов:

Например, этот беспорядок кода:

List<List<Item>> listOfLists;

//Merges lists if they are adjacent until only one is left.
void MergeAdjacentListsUntilOneIsLeft() 
{
    while(listOfLists.Count > 1)
    {
        BeginIteration:
        foreach(List<Item> list in listOfLists) 
        {
            foreach (Item item in list) 
            {
                foreach(List<Item> otherList in listOfLists) 
                {
                    if(list.IsAdjacentTo(otherList))
                    {
                        list.AddRange(otherList);
                        listOfLists.Remove(otherList);
                        goto BeginIteration;
                    }
                }
            }
        }
    }
}

становится:

List<List<Item>> listOfLists;

//Merges two lists if they are adjacent.
void MergeIteration()
{
    foreach(List<Item> list in listOfLists) 
    {
        foreach (Item item in list) 
        {
            foreach(List<Item> otherList in listOfLists) 
            {
                if(list.IsAdjacentTo(otherList))
                {
                    list.AddRange(otherList);
                    listOfLists.Remove(otherList);
                    return;
                }
            }
        }
    }
}

//Does it until only one is left.
void MergeAdjacentListsUntilOneIsLeft() 
{
    while(listOfLists.Count > 1)
    {
        MergeIteration();           
    }
}