我在编程时偶然发现了一个问题,这真的会受益于类似goto的结构。考虑这个例子:
//tries to find a solution for a problem 3 times
//in this process copies elements from old to newList
foreach (var tryNbr in Util.range(0,3))
{
List<A> newList = new List<A>();
List<A> oldList = workList;
while(oldList.Count != 0)
{
List<A> possibleMatched = FINDWITHLINQSTUFF;
//try stuff out
if(possibleMatches.Count == 0)
break;
//do more stuff
}
if(oldList.Any())
{
workList = newList;
return true;
}
}
所以我在这里的问题是,在我的while循环中,我需要检查一些条件,如果它是真的我想继续从下一个foreach迭代,因为我的整个前一个过程也不起作用。
由于更好的休息或继续可以做到这一点,我需要检查我背后的额外条件,这很容易出错,如果我可能在以后改变某些事情而不需要注意。
是否有像
这样的结构goto foreach;
或
continue foreach;
从下一个外部foreach循环继续? 它是否真的是一个可行的解决方案,在这里使用goto(并手动递增计数器?
PS:您对本规范的一般结构有更好的解决方案吗?
答案 0 :(得分:1)
如果while循环的结果应该控制(即继续)foreach循环,那么设计它:
bool WhateverMethod()
{
//tries to find a solution for a problem 3 times
//in this process copies elements from old to newList
foreach (var tryNbr in Util.range(0,3))
{
List<A> newList = new List<A>();
List<A> oldList = workList;
if (Matched(oldList, newList))
continue;
if(oldList.Any())
{
workList = newList;
return true;
}
}
}
bool Matched(List<A> oldList, List<B> newList)
{
while(oldList.Count != 0)
{
List<A> possibleMatched = FINDWITHLINQSTUFF;
//try stuff out
if(possibleMatches.Count == 0)
return false;
//do more stuff
}
return true; // I'm assuming?
}
这并没有解决goto的用法,或者问题“它总是邪恶的”但我建议goto是“总是”或“几乎总是”不必要的。