Экранируйте вложенный оператор IF и оцените переменную по родительскому условию

У меня есть анализатор файлов, который оценивает каждую строку txt файла по условию. Если условие выполнено, последующие строки в файле оцениваются по ряду вложенных операторов IF. Что я хотел бы сделать, так это выйти из вложенных операторов IF, как только родительское условие будет выполнено снова, затем оценить строку, которая сломалась против родителя, и снова запустить вложенные оценки. Я делаю это, потому что все вложенные операторы IF извлекают данные о родительском элементе. когда я нажимаю другой родительский элемент, избегаю дочерних оценок и начинаю снова.

это плохой способ справиться с ситуацией?

вот мой псевдокод

if (line.Contains(":rule ("))
{
    bInRuleFlag = true;

    while (bInRuleFlag == true)
    {
        if (line.Contains(":rule ("))
        {
            bInRuleFlag = false;
            // I have hit a parent element.
            // escape the while loop here and evaluate line against  the parent IF
        }
        else if (line.contatins(""))
        {
            //gets child elements to the rule
        }
        else if (line.contatins(""))
        {
            //gets child elements to the rule
        }
    }

}

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


person user2219930    schedule 24.03.2015    source источник
comment
Это работа для тривиального FSM.   -  person zerkms    schedule 24.03.2015


Ответы (1)


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

while (line.Contains(":rule ("))
{
    if (line.contatins(""))
    {
        //gets child elements to the rule
    }
    else if (line.contatins(""))
    {
        //gets child elements to the rule
    }
}

Кроме того, вы можете использовать команду break, чтобы выйти из цикла while.

    if (line.Contains(":rule ("))
    {
        break;
    }

Если вы просто хотите остановиться на этом и сразу перейти к следующей итерации цикла, вы можете использовать ключевое слово continue

    if (line.Contains(":rule ("))
    {
        continue;
    }
person Sam I am says Reinstate Monica    schedule 24.03.2015
comment
Я не думаю, что это сработает, потому что дочерние элементы находятся на следующих строках. Разве цикл while не сломается сразу после первой строки? - person user2219930; 24.03.2015
comment
Вы имеете в виду, если parent найдено, то continue цикл со следующей строкой? Если это так, используйте continue. - person Mahesh; 24.03.2015
comment
@user2219930 user2219930 делает именно то, что делает код, который вы разместили - person Sam I am says Reinstate Monica; 24.03.2015
comment
Спасибо. Продолжить то, что я искал. - person user2219930; 24.03.2015
comment
@ user2219930 вам все еще нужно условие, чтобы выйти из цикла - person Sam I am says Reinstate Monica; 24.03.2015