c # Принудительный цикл для проверки состояния - PullRequest
4 голосов
/ 02 августа 2009

Как заставить цикл проверять его состояние после каждой строки выполнения, а не только после завершения всего блока?

У меня есть цикл while (! оператор ) {}, но оператор можно изменить несколькими различными способами, и он должен вызвать разрыв цикла сразу после текущей строки в цикл завершил выполнение; вместо того, чтобы весь цикл цикла завершил цикл.

Есть ли способ сделать это?

Ответы [ 6 ]

12 голосов
/ 02 августа 2009

В зависимости от того, что вы делаете, вы можете рассмотреть вопрос о том, чтобы каждый оператор был делегатом, создавал массив делегатов и выполнял цикл for по всему массиву. Таким образом, цикл состоит из двух строк: одна проверяет условие, а когда выполняется делегат в текущей позиции массива.

3 голосов
/ 02 августа 2009

Как насчет того, чтобы эти методы вызывали пользовательское исключение и помещали try-catch для конкретного исключения в вашем цикле.

while (!condition) {
        try {
            //method calls
        } catch (CustomException ce) {
            break;
        }
    }
3 голосов
/ 02 августа 2009

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

while (processing)
{
    actionA();

    if (!processing)
        break;

    actionB();

    if (!processing)
        break;

    actionC();
}
3 голосов
/ 02 августа 2009

да, но вам это не понравится ... просто ставьте if (!condition) break; после каждой инструкции;)

2 голосов
/ 02 августа 2009

Вы можете создать собственный итератор (используя оператор yield). Итератор возвращает каждую строку (или несколько строк), которую вы хотите выполнить (используя анонимные методы). Затем вы можете перебирать каждую строку по одной и проверять условие внутри цикла. Вот как это будет выглядеть:

public delegate void DelegateType();

public static IEnumerable< DelegateType > GetStatements()
{
    // ---- replace with your code below ----
    yield return delegate() { Console.WriteLine("statement 1"); };
    yield return delegate() { Console.WriteLine("statement 2"); };
    yield return delegate() { Console.WriteLine("statement 3"); };
    yield return delegate() 
    { 
        // You can return multiples statements in one block.
        Console.WriteLine("statement 4"); 
        Console.WriteLine("statement 5");
    };
}

Вот как вы должны выполнять итерацию ваших операторов и проверять условие после каждого оператора.

IEnumerable<DelegateType> statementList = GetStatements();
foreach (DelegateType statement in statementList)
{
    statement();                   // Here is where your statement executes.
    if (!ConditionContinue())      // Check your condition here.
    {
        break;
    }
}
1 голос
/ 02 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...