プログラムの強力な機能の一つに、面倒な作業を自動で何度も実行してくれる「繰り返し処理(ループ)」があります。例えば、「100人の生徒データを順番に処理する」「HPが0になるまで攻撃を続ける」といった処理は、ループを使うことで実現できます。
この記事では、C#で使われる代表的な4つのループ構文を、それぞれの特徴と使い分けのポイントを交えながら詳しく解説します。
foreach
文 ― 配列やリストの全要素に使う
foreach
は、配列やリストといったデータの集まり(コレクション)に含まれる要素を、先頭から順番に一つずつ取り出して処理するのに最適なループです。
いつ使う?: コレクションの全要素に対して同じ処理を行いたい、かつ要素番号(インデックス)が不要な場合に最もシンプルに記述できます。
string[] fruits = { "りんご", "ばなな", "みかん" };
// fruits配列から要素を一つずつ取り出し、fruitという変数に入れて処理する
foreach (string fruit in fruits)
{
Console.WriteLine(fruit + "を食べました。");
}
実行結果
りんごを食べました。
ばななを食べました。
みかんを食べました。
for
文 ― 回数指定やインデックスが必要な時に
for
は、指定した回数だけ処理を繰り返したい場合や、配列などを要素番号(インデックス)を使って操作したい場合に最もよく使われる、汎用性の高いループです。
for
文は ()
の中に3つの式を記述します。
- 初期化子: ループ開始時に一度だけ実行される。(例:
int i = 0
) - 条件式: ループを続けるかどうかを毎回判定する。(例:
i < 5
) - 反復式: 1回のループ処理が終わるたびに実行される。(例:
i++
)i++
はインクリメントと呼び、i
の値を1増やします。逆にi--
(デクリメント)は1減らします。
サンプルコード1:決まった回数繰り返す
// iを0から4まで1ずつ増やしながら、5回繰り返す
for (int i = 0; i < 5; i++)
{
Console.WriteLine((i + 1) + "回目のこんにちは");
}
サンプルコード2:配列をインデックスで操作する
int[] scores = { 88, 92, 75 };
// iを0から (配列の長さ - 1) まで繰り返す
for (int i = 0; i < scores.Length; i++)
{
// scores[i] の形でインデックスを指定して要素にアクセス
Console.WriteLine((i + 1) + "番目の人の点数: " + scores[i]);
}
while
文とdo-while
文 ― 条件が満たされるまで繰り返す
while
は、ループの回数が事前に決まっておらず、特定の条件が満たされている間だけ処理を繰り返したい場合に使います。
while
文
()
内の条件式を先に評価し、true
である間、処理を繰り返します。最初に条件がfalse
なら、一度も実行されません。
int hp = 10;
// hpが0より大きい間、ループを続ける
while (hp > 0)
{
Console.WriteLine("現在のHP: " + hp);
hp = hp - 3; // HPを3減らす
Console.WriteLine("3のダメージ!");
}
Console.WriteLine("HPが0になりました。");
do-while
文
while
文と似ていますが、条件式の評価を処理の後に行います。そのため、{}
内の処理が最低でも1回は必ず実行されることが保証されます。
string input;
do
{
Console.WriteLine("何か入力してください ('exit'で終了)");
input = Console.ReadLine();
Console.WriteLine("入力された文字: " + input);
}
while (input != "exit"); // 入力が"exit"でない限り繰り返す
ループを制御する break
と continue
ループの途中で、その流れを制御したい場合があります。
break
文 ― ループを強制的に終了する
break
は、ループを即座に中断し、ループ構文の次の処理へ移ります。
// 1から10までの中で、最初に3の倍数を見つけたら終了する
for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
Console.WriteLine("3の倍数を見つけました: " + i);
break; // ループを抜ける
}
Console.WriteLine("i = " + i);
}
continue
文 ― 今回の処理だけをスキップする
continue
は、ループの現在の回における残りの処理をスキップし、次の回の処理の先頭へジャンプします。
// 1から10までのうち、奇数だけを表示する
for (int i = 1; i <= 10; i++)
{
// もし i が偶数なら
if (i % 2 == 0)
{
continue; // 今回の処理をスキップして次のループへ
}
Console.WriteLine(i);
}
まとめ
繰り返し処理にはいくつかの種類があり、状況に応じて最適なものを選択することが重要です。
foreach
: コレクションの全要素を順番に扱いたいとき。for
: 決まった回数を繰り返したい、またはインデックスが必要なとき。while
: 条件を満たす間繰り返したいとき(先に条件判定)。do-while
: 最低1回は実行し、その後条件を満たす間繰り返したいとき。
これらのループ構文は、プログラムによる自動化の核となる機能です。それぞれの特徴を理解し、使いこなしていきましょう。