【问题标题】:C# - Foreach loop with if statementC# - 带有 if 语句的 Foreach 循环
【发布时间】:2012-06-22 01:53:18
【问题描述】:

如果“if”语句为真,我该怎么做才能跳过 foreach 循环下面的代码并继续执行程序的其余部分

void()
{
    foreach()
    {
        if()
        {

        }
    }

    //code I want to skip if "if" statement is true

}

【问题讨论】:

  • continue 关键字来救你。如果您想跳出 for 循环,可以使用“Break”。
  • 您的问题太多含糊不清。 Yogendra 的评论可能是答案,具体取决于您的意思
  • 你必须在 if 语句块中声明 bool 并在你想跳过的区域使用它
  • 不需要布尔值。完成工作,然后休息 - 故事结束。
  • Patrick,你已经得到了答案,但我认为你应该考虑我的答案以供未来发展。 :) 也可以帮助你@dodexahedron

标签: c# if-statement foreach


【解决方案1】:

没有办法直接做你想做的事(没有“goto”标签——别想了!),但你可以使用“break”关键字,并设置一个以后可以参考的变量。

void()
{
    var testWasTrue = false;
    foreach()
    {
        if()
        {
            testWasTrue = true;
            break;  // break out of the "foreach"
        }
    }

    if( !testWasTrue ) {
        //code I want to skip if "if" statement is true
    }

}

【讨论】:

  • 不要理会布尔值。做这项工作,然后休息/返回。如果它是一个重要的代码块,那么很容易争论它应该是一个函数。请参阅下面的示例。
  • 除非这与您的答案完全不同。
  • 休息是无关紧要的,因为我们不知道他的逻辑。循环内可能有需要对所有项目执行的代码。
  • 不是他的问题的写法。他说,如果陈述是真的,“跳到”下面的代码。休息是必要的。然而,布尔值不是,而且只是浪费循环和内存。
  • 布尔必要的;如果您仔细阅读 OPs 问题,您会发现他想针对给定条件跳出循环,如果条件为真,则跳过一些额外的代码。如果不使用可怕的 goto 标签,如果不将条件存储为布尔值,就无法做到这一点。
【解决方案2】:

我知道这已经得到解答,但我想我会投入 2 美分,因为没有人考虑将支票抽象为单独的方法:

void()
{
    if (ShouldDoStuff(myCollection))
        DoStuff(myCollection);
    else
        DoOtherStuff(myCollection);
}

private bool ShouldDoStuff(collection)
{
    foreach()
    {
        if ()
            return true;
    }
    return false;
}

这在更高级别提供了更简洁的代码来处理您的算法,并消除了所讨论的所有混乱。它将void() 中检查和执行操作的任务清晰地分开,读者可以立即确切地知道程序流程是什么,而无需通过潜伏的布尔或中断逻辑来辨别他们在做什么。没有一种方法具有超过一项职责或任务。

是的,发帖人可能想在他们的 foreach 中做其他工作,但这是一个完全不同的讨论,而不是他们问题中描述的内容。如果您只是想检查给定的集合(或对象)是否满足某个条件,则可以将该检查移至单独的方法。 Even 为所有三个组件的自动化单元测试敞开大门。

即使DoStuffDoOtherStuff 没有被抽象为它们自己的方法,它也提供了更好的可读性和逻辑流程。

【讨论】:

    【解决方案3】:
    void()
    {
         bool process = true;
         foreach()
         {
              if()
              {
                  process = false;
                  break;
              }
         }
    
         if (process)
         {
           //code I want to skip if "if" statement is true
         }
    
    }
    

    【讨论】:

      【解决方案4】:

      正如我在评论中提到的,您可以通过额外的 bool 变量来做到这一点。

      void()
          {
              bool positiveResult; // by default it gets false value
              foreach()
              {
                  if()
                  {
                      positiveResult = true;
                      // you may use "break" to skip the loop
                      break;
                  }
              }
      
              if( !positiveResult  ) 
               {
                  //code I want to skip if "if" statement is true
               }
      
          }
      

      【讨论】:

      • 无需遍历整个集合。尽快休息或返回。此外,nix 布尔值。根本不需要。
      【解决方案5】:

      “break”关键字将跳出循环。

      foreach (someClass a in someArray) 
      {
        if(a.someProperty) // bool property 
        {
          //Stuff to do if that condition is true
          doSomethingElse();
          //Calling the break keyword will stop the loop and jump immediately outside of it
          break;
        }
        //Other code to run for each iteration of the loop
      }
      
      //Here is where execution will pick up either after break is called or after the loop finishes
      

      【讨论】:

        【解决方案6】:

        只有我知道布尔标志是怎么回事。

        void()
        {
          bool x = false;
          foreach()
          {
            if()
            {
              x = true;
              break;
            }
          }
          if(!x)
          {
            //Code to skip if "if" statement is true.
          }
        }
        

        不是很优雅,但很简单。 编辑:节拍 12 秒 :)

        【讨论】:

          【解决方案7】:
          void() 
          { 
              bool skip = false;
              foreach() 
              { 
                  if() 
                  { 
                     skip = true;
                  } 
              } 
          
              if(!skip)
              {
                  //code I want to skip if "if" statement is true 
              }
          } 
          

          【讨论】:

            【解决方案8】:

            如果您正在迭代的集合包含 IEnumerable 接口,您可以将 Any() 与 Lambda 一起使用!

            int[] myArray = { 1, 2, 3 };
            
                            if( myArray.Any((a) => a == 1) )
                            {
                                return;
                            }
            

            读取:如果我的数组包含任何值 a,其中 a 等于 1,则从该函数返回。

            另外,如果你想让它更难阅读,你可以省略花括号/方括号。

            if( myArray.Any((a) => a == 1) )
                 return;
            

            【讨论】:

            • 附带说明,您可以使用任何 IEnumerable 执行此操作。所以这可能是 List、Array、LinkedList、Queue、Stack、Dictionary 等。此外,您可能必须导入 System.Linq。
            猜你喜欢
            • 1970-01-01
            • 2017-01-13
            • 2019-12-12
            • 1970-01-01
            • 1970-01-01
            • 2016-12-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多