web-dev-qa-db-ja.com

ネストされたforeachループを解除して、C#の親foreachループに移動する方法

私は次のコードを持っています:

foreach(// Some condition here)
{
    while (// Some condition here)
    {
        foreach (// Some condition here)
        {
             if (// Condition again)
             {
                  //Do some code
             }
             if (// Condition again)
             {
                 //Stop the first foreach then go back to first foreach
             }
        }
    }
}

私がやりたいのは、最後のifループで2番目のforeachステートメントにヒットしたときに、最初のforeachループに戻ることです。

注:2番目のifステートメントがtrueでない場合は、条件がtrueにならないまで、最後のforeachループを継続する必要があります。

前もって感謝します!

22
Gerald

これを直接行う唯一の方法は、gotoを使用することです。

別の(より良い)オプションは、問題がなくなるまで再構築することです。たとえば、メソッドに内部コード(while + foreach)を入れ、returnを使用して戻ります。

32
Henk Holterman

このようなもの:

resetLoop = false;
for(// Some condition here)
{
    while (// Some condition here)
    {
        foreach (// Some condition here)
        {
             if (// Condition again)
             {
                  //Do some code
             }
             if (// Condition again)
             {
                 //Stop the first foreach then go back to first foreach
                 resetLoop = true;
                 break;
             }
        }
        if (resetLoop) break;
    }
    if (resetLoop) {
        // Reset for loop to beginning
        // For example i = 0;
    }
}
15
Dusan

まだ誰も言及していませんが(ヘンクが簡単に言及しました)、ループを独自のメソッドに移動してreturnを使用するのが最善の方法です。

public ReturnType Loop(args)
{
foreach outerloop
    foreach innerLoop
       if(Condition)
          return;
}
7
Sayse

私があなたがgotoステートメントを参照する人の答えを受け入れたのを見ると、現代のプログラミングと専門家の意見ではgotoはキラーです、私たちはそれをいくつかの特定の理由があるキラーと呼びました、ここではそれについては議論しませんこの時点で、しかしあなたの質問の解決策は非常に簡単です、私は私の例でそれを示すように、この種のシナリオでブールフラグを使用することができます:

foreach(// Some condition here)
{
    //solution
    bool breakme = false;

    while (// Some condition here)
    {
        foreach (// Some condition here)
        {
            if (// Condition again)
            {
                //Do some code
            }
            if (// Condition again)
            {
                //Stop the first foreach then go back to first foreach
                breakme = true;
                break;
            }
        }
    }
    if(breakme)
    {
        break;
    }
}

シンプルでプレーン。 :)

5
Steve

私の前に述べたように、コードをリファクタリングして、3つのループを入れ子にする必要があるかどうかを確認することもお勧めします。そうであり、ロジックが関与していると思う場合は、サブ関数への分割を検討する必要があります(推奨)

単純なコードソリューションの場合:

foreach(// Some condition here)
{
    var broke = false;
    while (// Some condition here)
    {
        foreach (// Some condition here)
        {
             if (// Condition again)
             {
                  //Do some code
             }
             if (// Condition again)
             {
                 //Stop the first foreach then go back to first foreach
                 broke = true;
                 break;
             }
        }
        if (broke) break;
        // continue your while loop
    }
}
4
Eyal H
var broken = false;
foreach(// Some condition here)
{
    broken = false;
    while (!broken && // Some condition here)
    {
        foreach (// Some condition here)
        {
             if (// Condition again)
             {
                 //Do some code
             }
             if (// Condition again)
             {
                 //Stop the first foreach then go back to first foreach
                 broken = true;
                 break;
             }
        }
    }
}
3
Jaapjan