如果我有一个嵌套的foreach循环,我该如何打破内部循环并告诉外部继续在那个点继续而不在内部循环下面做任何其他代码?
foreach(var item in items)
{
foreach(var otheritem in otheritems)
{
if (!double.TryParse(otheritem))
{
//break inner loop
//continue outer loop so we never get to DoStuff()
}
}
DoStuff();
}
答案 0 :(得分:35)
使用旗帜怎么样?
foreach(var item in items)
{
bool flag = false;
foreach(var otheritem in otheritems)
{
if (!double.TryParse(otheritem))
{
flag = true;
break;
}
}
if(flag) continue;
DoStuff();
}
答案 1 :(得分:21)
foreach(var item in items)
{
foreach(var otheritem in otheritems)
{
if (!double.TryParse(otheritem))
{
//...
goto nextUpperLoop;
}
}
DoStuff();
nextUpperLoop: ;
}
答案 2 :(得分:18)
首先编写一个更好的Double.TryParse版本:
static double? TryParseDouble(this string s)
{
double d;
return double.TryParse(s, out d) ? (double?)d : (double?)null;
}
好的,现在你有一些东西可以很容易地用来完全消除内环,所以问题就消失了:
foreach(var item in items)
if (!otheritems.Any(otherItem=>otherItem.TryParseDouble() == null))
DoStuff();
而不是试图弄清楚如何移动控制,只是编写看起来像逻辑的代码。如果逻辑是“如果任何其他项不解析为双精度,则不执行操作”,则使用Any谓词测试所有其他项以查看其中任何项是否不解析为双精度。没有循环,因此不需要花哨的循环控制。
我倾向于更进一步;捕获查询中的逻辑,然后迭代查询:
var goodItems = from item in items
where !item.OtherItems.Any(otherItem=>otherItem.TryParseDouble() == null))
select item;
foreach(var goodItem in goodItems)
DoStuff(goodItem);
答案 3 :(得分:12)
简单是最好的......
bool doStuff = true;
foreach(var otheritem in otheritems)
{
if (!double.TryParse(otheritem))
{
doStuff = false;
break;
}
}
if(doStuff) DoStuff();
另一种方法是重构:
foreach(var outerItem in outerLoop) {
Foo(outerItem);
}
...
void Foo(OuterItem item) {
foreach(var innerItem in innerLoop) {
if(someTest) return;
}
DoStuff();
}
return
确保DoStuff
不会发生。
答案 4 :(得分:5)
你需要一个变量来控制,就像你说的那样......做一个break
。
bool doStuff = true;
foreach(var item in items)
{
doStuff = true;
foreach(var otheritem in otheritems)
{
if (!double.TryParse(otheritem))
{
doStuff = false;
break;
}
}
if (doStuff)
DoStuff();
}
答案 5 :(得分:3)
foreach(var item in items)
{
var shouldContinue = false;
foreach(var otheritem in otheritems)
{
if (!double.TryParse(otheritem))
{
shouldContinue = true;
//break inner loop
//continue outer loop so we never get to DoStuff()
}
}
if(shouldContinue)
continue;
DoStuff();
}
答案 6 :(得分:0)
Iirc休息一下;语句只会打破最接近的循环,所以发出一个中断;在内循环中应该继续外循环上的下一个项目。
答案 7 :(得分:0)
从您的代码段中不清楚,但如果您只需要在otheritems
中查找不可解析的值,那么您可以使用LINQ:
foreach(var item in items)
{
bool shouldISkip = otheritems.Any(otherItem => !double.TryParse(otherItem));
if(shouldISkip) continue;
DoStuff();
}