【问题标题】:c# Force loop to check conditionc#强制循环检查条件
【发布时间】:2009-08-02 12:52:18
【问题描述】:

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

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

有什么办法吗?

【问题讨论】:

  • 你能给我们一个关于条件是什么的想法吗?如果是这样,也许我们可以给出更具体的想法。
  • 是的,请提供一个您正在尝试做的示例。可能有比尝试在循环中的每个操作之后检查条件更好的模式(也许是命令模式)。
  • 没有这样的语言。你一定是在做梦吧。

标签: c# loops


【解决方案1】:

根据您正在执行的操作,您可以考虑让每个语句成为一个委托,创建一个委托数组,并在该数组上运行一个 for 循环。这样循环就只有两行:一是检查条件,二是在当前数组位置执行委托。

【讨论】:

  • 代表不适用于这种情况。相反,我选择重组循环的内容并在战略点进行检查。感谢大家的回复。
  • 你能解释一下为什么代表在这种情况下不能工作吗?无论如何,我将我的解决方案提供给其他可能觉得有用的人:stackoverflow.com/questions/1218846/…
【解决方案2】:

是的,但你不会喜欢它...只需在每条指令后加上 if (!condition) break; ;)

【讨论】:

  • 这就是为什么我怀念在 C# 中没有 C++ 宏的原因。
【解决方案3】:

这不是语言的工作方式。您必须定期检查:

while (processing)
{
    actionA();

    if (!processing)
        break;

    actionB();

    if (!processing)
        break;

    actionC();
}

【讨论】:

    【解决方案4】:

    让这些方法抛出一个自定义异常并在循环中为特定异常放置一个 try-catch 怎么样?

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

    【讨论】:

    • +1 因为根据条件(可能是错误条件),这可能是合适的。我会避免它,但如果条件不是你想要的,除非出现例外。
    • -1 使用异常来处理异常情况,而不是控制流程。
    • 与编程中的大多数事情一样,在有意义的地方使用一些东西。我同意对控制流使用异常是不好的,但在 OP 的情况下,它可能是一个实用的解决方案。
    【解决方案5】:

    您可以创建一个自定义迭代器(使用 yield 语句)。迭代器将返回您想要执行的每一行(或多行)(使用匿名方法)。然后,您可以一次遍历每一行并检查循环 inside 的条件。下面是它的外观:

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

    【讨论】:

      【解决方案6】:

      我认为您需要在可以更改值的每一行之后添加一个 if 语句,如果满足条件则使用中断。

      【讨论】:

        猜你喜欢
        • 2017-04-03
        • 2013-02-09
        • 2010-12-16
        • 1970-01-01
        • 2015-09-03
        • 2020-05-01
        • 2019-11-23
        • 2021-08-09
        • 2013-06-24
        相关资源
        最近更新 更多