C# 强制循环检查条件

4

如何强制循环在每行执行后检查其条件,而不是仅在整个块完成时检查?

我有一个while(!语句) { }循环,但语句可以通过几种不同的方法进行更改,并且应该在当前循环行完成执行后立即强制循环中断;而不是在整个循环块完成一个周期时。

有没有办法做到这一点?


你能告诉我们条件是什么吗?如果可以的话,也许我们可以提供更具体的想法。 - AaronLS
是的,请提供您尝试做什么的示例。可能有比在循环内每个操作后检查条件更好的模式(例如命令模式)。 - Richard Clayton
没有一种编程语言是这样工作的。你一定是在做梦。 - John Saunders
6个回答

12

根据你正在做的事情,你可以考虑让每个语句成为一个委托对象(delegate),创建一个委托对象数组,并在数组上运行for循环。 这样,循环只需要两行代码:一行用于检查条件,当执行当前数组位置上的委托对象时,执行另一行。


委托在这种情况下不起作用。我选择重新构建循环的内容,并在关键点进行检查。感谢大家的回复。 - Scorpion
你能解释一下为什么在这种情况下委托不起作用吗?我还是把我的解决方案放在这里,以便其他人可以找到它:https://dev59.com/4UjSa4cB1Zd3GeqPHrWB#1219204 - Robert Cartaino

3

这不是语言的工作方式。你需要定期检查:


while (processing)
{
    actionA();

    if (!processing)
        break;

    actionB();

    if (!processing)
        break;

    actionC();
}

3

那么可以将这些方法抛出自定义异常,并在循环中针对特定的异常使用try-catch语句。

while (!condition) {
        try {
            //method calls
        } catch (CustomException ce) {
            break;
        }
    }

+1 是因为根据条件(可能是错误条件),这可能是适当的。 但如果条件不是你希望出现异常的情况,我还是会避免使用它。 - AaronLS
3
使用异常处理来处理异常情况,而不是用它来控制程序流程。 - Matt Howells
1
与编程中的大多数事物一样,使用恰当的工具是很重要的。我同意在控制流程中使用异常是不好的,但在OP的情况下,这可能是一个实用的解决方案。 - Ryan Ische

3

是的,但你可能不会喜欢...只需在每个指令后添加if (!condition) break; ;)


这就是为什么我想念在C#中没有C++宏的原因。 - AaronLS

2

您可以创建一个自定义迭代器(使用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
我认为在每个可能改变值的行后面都需要一个if语句,并且如果条件满足则需要使用break。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接