0

プログラミング中に、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 ループで何らかの条件をチェックする必要があることです。それが true の場合は、前のプロセス全体が機能しなかったため、次の foreach 反復から続行したいと考えています。

より近い中断または継続がこれを行うことができるので、必要な注意を払わずに後で何かを変更する可能性がある場合、エラーが発生しやすい、while の背後にある余分な条件を確認する必要があります。

のような契約はありますか

goto foreach;

また

continue foreach;

次の外側の foreach ループから続くのはどれですか? ここでgotoを使用することは実際に実行可能な解決策でしょうか(そしてカウンターを手動でインクリメントしますか?

PS: このコードの一般的な構造について、より良い解決策はありますか?

4

1 に答える 1

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 は「常に」または「ほぼ常に」不要であることをお勧めします。

于 2016-03-17T17:01:07.497 に答える