私は次のコードを持っています:
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
ループを継続する必要があります。
前もって感謝します!
これを直接行う唯一の方法は、goto
を使用することです。
別の(より良い)オプションは、問題がなくなるまで再構築することです。たとえば、メソッドに内部コード(while + foreach)を入れ、returnを使用して戻ります。
このようなもの:
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;
}
}
まだ誰も言及していませんが(ヘンクが簡単に言及しました)、ループを独自のメソッドに移動してreturn
を使用するのが最善の方法です。
public ReturnType Loop(args)
{
foreach outerloop
foreach innerLoop
if(Condition)
return;
}
私があなたが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;
}
}
シンプルでプレーン。 :)
私の前に述べたように、コードをリファクタリングして、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
}
}
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;
}
}
}
}