C#中foreach循环如何使用continue关键字?

3

可能是重复问题:
在扩展范围内使用continue和break

我有一个问题。 我不知道如何在foreach中为“for”调用continue。

代码:

for(int i = 0; i < ...; i++)
{
  foreach(´´ .. in ´´)
  {
    if(,,.Value == null)
      // A!
  }
}

我需要把代码中的"A!"替换为"for"以使代码继续运行,而不是使用foreach。我使用了基本的continue,但它只对foreach起作用。

解决办法:

for(int i = 0; i < ...; i++)
{
  bool Ab = false;

  foreach(´´ .. in ´´)
  {
    if(,,.Value == null)
      Ab = true;
  }

  if(Ab)
    continue;
}

3
你正在遍历什么样的对象?可能有比使用foreach...if...反模式更好的方法。 - Stefan H
你不能这样做,需要使用一个变量将该信息传递到for循环中。另外,如果接受一些答案,你会得到更好的回复。 - Jodrell
尝试在您的foreach循环中使用break,这将导致执行跳出foreach并继续for循环。 - Nathan
我认为这个可能是(可能不令人满意的)答案。 - Johannes Egger
4个回答

3
如果你需要停止内部循环,并继续外部循环,只需在内部循环中使用break语句即可。
for(int i = 0; i < ...; i++)
{   
    foreach(var thing in something)   
    {     
        if(thing.Value == null)       
        {
            break; 
        } 
    }

}


但我怎么能在break上调用continue呢?需要使用任何“if”吗? - user1085907
break语句会停止内部循环(你想要的),然后继续外部循环(你想要的),所以我不确定你还需要什么。如果你有一些特定的需求,而这个方法无法满足,你需要在问题中发布更多的代码,这样我们才能确切地知道你想要做什么。 - John Gardner

1

如果这是您实际的代码结构,您可以从foreach中使用break,并且for将立即继续下一次迭代,因为当前迭代已经结束。

然而,如果在完成foreach循环后,您在for迭代中有更多的代码,则可能会出现一些罕见的情况,您可能想要使用goto跳到当前for迭代的末尾。

更清晰的方法是,设计内部循环以使其发生在外部循环的末尾,这样内部循环中的break就是外部循环的continue


倒水在我燃烧的耳朵上。是的,他们给你goto命令,因为他们知道如果不这样做,那么某个地方会出现一种根本无法通过其他方式解决的情况。但是,最后一段是“教学答案”;应该向试图学习正确编码方法的人提供此答案。任何时候、任何地点使用goto都是非常糟糕的代码气味。 - KeithS

0

你能不能只是在内部的foreach循环里结束呢?

for (int i = 0; i < blah; i++) {
  foreach (var item in collection) {
    if (ShouldContinue(item)) {
      break;
    }
    // other stuff
  }
  // don't put things here
}

如果您需要代码,在我放置了不要在这里放东西的地方,如果您将内部循环封装到一个函数中,可能会更清晰:
bool ProcessOrContinue(IEnumerable collection) {
  foreach (var item in collection) {
    if (ShouldContinue(item)) {
      return true;
    }
    // other stuff
  }
  return false;
}

for (int i = 0; i < blah; i++) {
  if (ProcessOrContinue(collection)) continue;
  // more things
}

0

Continue 是一种花哨的 goto。在这里,你可以使用递归代替。


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