ヘッダー
C# サンプル集
 

条件指定の繰り返し(while と do)

2022/12/4

→ Visual Basic のサンプルに切り替える → Python のサンプルに切り替える

 

無限に繰り返す

この例では、「こんにちは!」と出力してから1秒待つという処理を無限に繰り返します。

while (true)
{
    System.Diagnostics.Debug.WriteLine("こんにちは!");
    Task.Delay(1000).Wait(); //何もしないで1秒待つ。
}

Debug.WriteLineが表示される場所

 

これでもできます。

do
{
    System.Diagnostics.Debug.WriteLine("こんにちは!");
    Task.Delay(1000).Wait(); //何もしないで1秒待つ。
} while (true);

Debug.WriteLineが表示される場所

 

 

条件付きで繰り返す。条件は1周ごとに最初に判断する。(while)

この例は、変数 i が 5 より小さい間処理を繰り返します。

int i = 0;
while (i < 5)
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

条件付きで繰り返す。条件は1周ごとに最後に判断する。(do)

この例は、変数 i が 5 より小さい間処理を繰り返します。

int i = 0;
do
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
} while (i < 5);

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

条件がfalseになった場合に1回だけ処理を実行する

int i = 0;

bool loopCondition;
while (loopCondition = i < 3)
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}
if (loopCondition == false)
{
    System.Diagnostics.Debug.WriteLine("条件が false になったのでループはこれで終わります。");
}

メモ:もし、最初から条件が false の場合、ループ本体は実行されず、if の処理だけが実行されます。

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
条件が false になったのでループはこれで終わります。

 

 

途中でループから抜け出す(break)

この例では、while文の条件で 変数 i が 10より小さい限り繰り返す指定になっていますが、if 文で条件判断してi が 3 のときループを抜けます。

int i = 0;
while (i < 10)
{
    i++;
    if (i == 3)
    {
        break;
    }

    System.Diagnostics.Debug.WriteLine($"i = {i}");
}

System.Diagnostics.Debug.WriteLine("終了");

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

i = 1
i = 2
終了

 

do でも同様です。この例は上記の while の例と全く同じ結果になります。

int i = 0;
do
{
    i++;
    if (i == 3)
    {
        break;
    }

    System.Diagnostics.Debug.WriteLine($"i = {i}");
} while (i < 10);

System.Diagnostics.Debug.WriteLine("終了");

Debug.WriteLineが表示される場所

 

この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。「華氏が100度を超える」とbreakして終了します。

double c = 0; //摂氏。日本で通常使用する温度の単位。℃。
double f; //華氏。主にアメリカで使用する温度の単位。゜F。

while(true)
{
    f = (9.0 / 5.0 * c) + 32; //摂氏(℃)から華氏(゜F)を算出。

    if (f > 100)
    {
        //華氏が100を超える場合、ループを終了します。
        System.Diagnostics.Debug.WriteLine("breakします。");
        break;
    }


    // ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
    System.Diagnostics.Debug.WriteLine($"{c,5:0.0}℃ = {f,5:0.0}゜F");
    c += 10;
}

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)

0.0℃ = 32.0゜F
10.0℃ = 50.0゜F
20.0℃ = 68.0゜F
30.0℃ = 86.0゜F
breakします。

 

 

ループがすべて完了したか確認する (たとえば、breakしていないかどうか)

この例では 変数 i が 9999 の場合 break します。ループの処理がすべて終わった後に break して終わったのか、break しないで終わったのかメッセージを出力します。 このまま実行すると i は 9999 にならないので break は発生しないで終了します。

bool loopCondition;
int i = 0;

while (loopCondition = i < 10)
{
    i++;
    System.Diagnostics.Debug.WriteLine($"i = {i}");

    if (i == 9999) //←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
    {
        break;
    }
}
if (!loopCondition)
{
    System.Diagnostics.Debug.WriteLine("breakしないでループを終了しました。"); //←これが出力されます。
}

 

do でも同様です。この例は上記の while の例と全く同じ結果になります。

bool loopCondition = false;
int i = 0;

do
{
    i++;
    System.Diagnostics.Debug.WriteLine($"i = {i}");

    if (i == 9999) //←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
    {
        break;
    }
} while (loopCondition = i < 10);
if (!loopCondition)
{
    System.Diagnostics.Debug.WriteLine("breakしないでループを終了しました。"); //←これが出力されます。
}

 

 

その周を中断し、次の周を開始する(continue)

if 文で条件判断して2周目と3周目であれば処理を中断して次の周を開始します。

int i = 0;
while (i < 5)
{
    i++;

    System.Diagnostics.Debug.WriteLine($"i = {i} 開始");

    if ( i == 1 || i == 2)
    {
        continue;
    }

    System.Diagnostics.Debug.WriteLine($"i = {i} 終了");
}

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

i = 1 開始
i = 2 開始
i = 3 開始
i = 3 終了
i = 4 開始
i = 4 終了
i = 5 開始
i = 5 終了

 

do でも同様です。この例は上記の while の例と全く同じ結果になります。

int i = 0;
do
{
    i++;

    System.Diagnostics.Debug.WriteLine($"i = {i} 開始");

    if ( i == 1 || i == 2)
    {
        continue;
    }

    System.Diagnostics.Debug.WriteLine($"i = {i} 終了");
} while (i < 5);

Debug.WriteLineが表示される場所

 

この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。華氏が整数になる場合にだけ出力します。華氏が100度より下である限り繰り返します。

double c = 0; //摂氏。日本で通常使用する温度の単位。℃。
double f; //華氏。主にアメリカで使用する温度の単位。゜F。

while((f = (9.0 / 5.0 * c) + 32) < 100) //摂氏(℃)を華氏(゜F)に変換した値を変数fに代入し、それが100より下の場合処理を実行します。
{
    c += 1;

    if (f - Math.Truncate(f) != 0)
    {
        //小数部が 0 でない場合、何もせず次の繰り返しにジャンプします。
        continue;
    }

    // ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
    System.Diagnostics.Debug.WriteLine($"{c - 1,5:0.0}℃ = {f,5:0.0}゜F");  
}

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)

0.0℃ = 32.0゜F
5.0℃ = 41.0゜F
10.0℃ = 50.0゜F
15.0℃ = 59.0゜F
20.0℃ = 68.0゜F
25.0℃ = 77.0゜F
30.0℃ = 86.0゜F
35.0℃ = 95.0゜F

 

 

条件達成まで繰り返す。条件は1周ごとに最初に判断する。(while)

この例は、変数 i が 5 になるまで処理を繰り返します。

int i = 0;
while (! (i == 5))
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}

Debug.WriteLineが表示される場所

メモ:ループの終了条件を指定する特別な機能はありません。もし必要ならこの例のようにループの条件を ! で反転させるなどすることになります。

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

条件達成まで繰り返す。条件は1周ごとに最後に判断する。(do)

この例は、変数 i が 5 になるまで処理を繰り返します。

int i = 0;
do
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
} while (! (i == 5));

Debug.WriteLineが表示される場所

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

 

5回繰り返す

int i = 0;
while (i < 5)
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}

Debug.WriteLineが表示される場所

メモ:この例のように単純に回数を指定して繰り返すには for の方が適しています。

実行すると下記の通り出力されます。

現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。

 

これでもできます。

int i = 0;
do
{
    i++;
    System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
} while (i < 5);

Debug.WriteLineが表示される場所

メモ:この例のように単純に回数を指定して繰り返すには for の方が適しています。

 

 

条件判断と同時に変数に代入する

次の例は、1~6のランダムな数値を生成します。6が生成されると何もせず終了します。

int i;
while ((i = Random.Shared.Next(1, 7)) <= 5)
{
    System.Diagnostics.Debug.WriteLine(i); 
}

Debug.WriteLineが表示される場所

 

do でも同様ですが、条件を判断するのが処理の最後なので、この例では、最初に必ず 0 が出力されます。

int i = 0;
do
{
    System.Diagnostics.Debug.WriteLine(i); 
} while ((i = Random.Shared.Next(1, 7)) <= 5);

Debug.WriteLineが表示される場所

 

 

参考:プログラミング言語ごとの条件付きループの比較

方法 Visual Basic C# Python
条件の省略 Do で可能。
省略すると無限ループします。
不可 不可
ループ先頭での条件判断 Do と While で可能 while で可能 while で可能
ループ最後での条件判断 Do で可能 do で可能 不可
条件が false と評価された
場合に実行する処理の記述
不可 不可 else で可能
ループを継続する条件の記述 Do と While で可能 do と whileで可能 while で可能
ループを終了する条件の記述 Do で 可能
(Untilを使う)
不可 不可
ループの終了 Exit Do または Exit While で可能 break で可能 break で可能
次の周へのジャンプ Continue Do または
Continue While で可能
continue で可能 continue で可能
条件判断と代入を
組み合わせと記述
不可 = で可能 := で可能

この表は言語に用意されている機能を表現しています。「不可」となっている部分の多くはロジックを自作することで実現は可能です。