Gotolike结构/改进继续 - 总是邪恶?

时间:2016-03-17 16:42:54

标签: c# break goto continue control-structure

我在编程时偶然发现了一个问题,这真的会受益于类似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:您对本规范的一般结构有更好的解决方案吗?

1 个答案:

答案 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是“总是”或“几乎总是”不必要的