1. ホーム
  2. c#

[解決済み】ネストされたループからの脱却

2022-04-16 06:39:21

質問

forループが別のループに入れ子になっている場合、どうすれば効率的に両方のループ(内側と外側)から最短で抜け出すことができますか?

ブール値を使用して、別のメソッドに移動と言う必要はなく、外側のループの後の最初の行のコードだけを実行するようにしたいのです。

手っ取り早く、いい方法はないでしょうか?

例外は安くはない/本当に例外的な状態のときだけ投げるべき、などと考えていました。したがって、この解決策はパフォーマンスの観点からは良いとは思えません。

.NETの新しい機能(アノン・メソッド)を利用して、かなり基本的なことを行うのは正しいとは思えません。

解決方法は?

さて。 goto しかし、それは醜いですし、常に可能とは限りません。また、ループをメソッド(または非メソッド)に配置し、その中で return でメインコードに戻ります。

    // goto
    for (int i = 0; i < 100; i++)
    {
        for (int j = 0; j < 100; j++)
        {
            goto Foo; // yeuck!
        }
    }
Foo:
    Console.WriteLine("Hi");

vs:

// anon-method
Action work = delegate
{
    for (int x = 0; x < 100; x++)
    {
        for (int y = 0; y < 100; y++)
        {
            return; // exits anon-method
        }
    }
};
work(); // execute anon-method
Console.WriteLine("Hi");


C# 7 では "ローカル関数" が得られるはずで、(構文は未定ですが)次のような動作をすることに注意してください。

// local function (declared **inside** another method)
void Work()
{
    for (int x = 0; x < 100; x++)
    {
        for (int y = 0; y < 100; y++)
        {
            return; // exits local function
        }
    }
};
Work(); // execute local function
Console.WriteLine("Hi");