C# - 使用if语句的foreach循环

6

如何实现这样的代码:如果“if”语句为真,则跳过foreach循环下面的代码并继续执行程序的其余部分?

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

        }
    }

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

}

继续关键字来拯救你。如果你想要跳出for循环,可以使用“Break”。 - AlwaysAProgrammer
2
你的问题太过模糊不清。根据你的意思,Yogendra的评论可能就是答案。 - McAden
你需要在if语句块中声明bool,并在想要跳过的区域使用它。 - Yusubov
不需要布尔值。做完工作就可以了,然后结束故事。 - dodexahedron
Patrick,你已经得到了答案,但我认为你应该考虑我的答案以供未来开发使用。 :) 这也可能对@dodexahedron有所帮助。 - Chris Sinclair
8个回答

9

如果不使用“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
    }

}

不要纠结于布尔值。先完成工作,然后跳出/返回。如果这是一个重要的代码块,很容易争论它应该是一个函数。请参考下面的示例。 - dodexahedron
除此之外,这与您的答案非常不同。 - McAden
2
中断语句是无关紧要的,因为我们不知道他的逻辑。循环内部可能有需要对所有项目执行的代码。 - Jon
不是这个问题的写法。他说如果语句为真,就“跳过”到下面的代码。break是必要的。布尔值不是必要的,只是浪费循环和内存。 - dodexahedron
1
布尔值是必要的;如果你仔细阅读 OP 的问题,你会发现他想要在给定条件下跳出循环,然后如果条件为真,则跳过一些额外的代码。除了使用可怕的 goto 标签之外,没有其他方法可以在不将条件存储为布尔值的情况下实现这一点。 - Ethan Brown

3

我知道这个问题已经有答案了,但是考虑到没有人将检查过程抽象成一个单独的方法,所以我想加入我的意见:

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

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

这提供了更清晰的代码,更容易处理算法,并消除了所有讨论中的混乱。它在void()中干净地分离检查和执行任务,读者立即知道程序流程,而无需识别布尔值或中断逻辑。没有单个方法具有超过1个责任或任务。
是的,可能帖子作者想在他们的foreach中做其他工作,但这是一个完全不同的讨论,不是他们问题中所描述的。如果您只想检查给定集合(或对象)是否符合某个条件,则可以将该检查移动到单独的方法中。甚至还为三个组件提供了自动化单元测试的机会。
即使DoStuffDoOtherStuff没有抽象成自己的方法,它也提供了更好的可读性和逻辑流程。

1

'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

1
void()
{
     bool process = true;
     foreach()
     {
          if()
          {
              process = false;
              break;
          }
     }

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

}

1

正如我在评论中提到的那样,您可以通过额外的布尔变量来实现这一点。

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
         }

    }

不需要遍历整个集合。尽快使用break或return退出。此外,取消布尔值。根本不需要。 - dodexahedron

0
void() 
{ 
    bool skip = false;
    foreach() 
    { 
        if() 
        { 
           skip = true;
        } 
    } 

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

0

我知道的唯一方法是使用布尔标志。

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

不是非常优雅,但很容易。 编辑:被12秒打败了 :)


0

如果您正在迭代的集合包含IEnumerable接口,您可以使用带有Lambda的Any()方法!

int[] myArray = { 1, 2, 3 };

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

这段代码的意思是:如果我的数组中包含任何一个值 a,且该值等于 1,则退出此函数。

如果你想让它更难读懂,可以省略花括号。

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

顺便提一下,您可以使用任何IEnumerable来完成此操作。因此,这可以是List、Array、LinkedList、Queue、Stack、Dictionary等。另外,您可能需要导入System.Linq。 - UnskilledBuild

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