简化嵌套循环逻辑

时间:2011-02-23 18:27:53

标签: c# goto

我在尝试简化嵌套循环中包含的某些逻辑时遇到了一些麻烦

我在下面提供了一些伪代码,这是我正在处理的基础知识。实际代码更复杂,包含多个嵌套循环结构。

我负责维护此代码,我不是它的原始作者

这是一个goto有效的地方。

while(CONDITION)
{
  while(CONDITITION2)
  {
    if(CONDITION3)
      break CONDITION2

    if(CONDITION4)
      break CONDITION
  }
}

预先形成这些代码中断有很多复杂性。

我不允许使用goto,但我认为这是我目前正在尝试做的更容易的解决方案。在这种情况下,我是否应该尝试证明使用goto。 感谢

PRASHANT:)

6 个答案:

答案 0 :(得分:3)

引入变量

bool breakOuter = false;
while(CONDITION)
{
  while(CONDITITION2)
  {
    if(CONDITION3)
      break;

    if(CONDITION4)
    {
      breakOuter = true;
      break;
    }
  }
  if(breakOuter)
    break;
}

答案 1 :(得分:1)

对条件1使用变量:

bool condition1 = true;
while (CONDITION && condition1)
{
    while (CONDITION2)
    {
        if (CONDITION3)
            break;
        if (CONDITION4)
        {
            condition1 = false;
            break;
        }
    }
}

答案 2 :(得分:1)

当Java(不是C#,但相关)决定不允许goto时,他们通过代码分析发现90%的gotos用于循环,其余的用于非常糟糕的东西。

中断和继续仍然存在,因为它们是合法的,本地化的有效。确保记录它们的去向和原因,但它们仍然非常有用。

您似乎以最有效的方式使用它们。

答案 3 :(得分:1)

你正在为乱糟糟的复杂代码做好准备。如果可能的话考虑LINQ(循环本身实际上是代码味道,特别是复杂的代码),否则考虑将内循环重构为单独的方法并使用return;

编辑:Eric Lippert评论此问题的各种替代方案的好文章:http://blogs.msdn.com/b/ericlippert/archive/2010/01/11/continuing-to-an-outer-loop.aspx

答案 4 :(得分:1)

即使不完全了解上下文,我也可以说我不想成为该代码的下一个程序员。

LINQ可能会简化它。如果您正在使用ReSharper,它会在适当的时候为您推荐。

除此之外,我会更多地考虑如何首先进入这些嵌套循环并尝试尽可能多地删除它们。更好的对象模型或智能使用模式可以为您提供更好,更易维护的解决方案。

答案 5 :(得分:0)

怎么样:

while(CONDITION)
{
  while(CONDITITION2)
  {
    if(CONDITION3)
      break CONDITION2

    if(CONDITION4)
      break CONDITION2
  }
  if(CONDITION4)
    break CONDITION
}

您还可以尝试将违规条件纳入while条件。