前回は、条件分岐(if・switch・三項演算子)の基本について学びました。

今回は、C#の繰り返し処理(foreach・for・while)について学びます。
繰り返し処理とは、同じ処理を必要な回数だけ自動で繰り返す仕組みで、条件分岐と並んでプログラミングに欠かせない要素です。
C#の代表的な繰り返し処理であるforeach・for・whileの基本的な使い方と、実務で最もよく使われる「foreach文」の注意点についてわかりやすく解説します。
C#の代表的な繰り返し処理
C#でよく使われる繰り返し構文のforeach・for・whileの基本について説明します。
foreach文
foreach文は、リストや配列などの「コレクション」の中身を1つずつ取り出して処理するための構文です。
「リストの中身を順番に処理したい」という場面でとても便利で、書き方がシンプルなのが特徴です。
foreach (var 要素 in コレクション)
{
// 要素ごとの処理
}
以下は、名前が入ったリストの中身を1つずつコンソールに表示するサンプルコードです。
var names = new List<string> { "佐藤", "鈴木", "高橋" };
foreach (var name in names)
{
Console.WriteLine($"こんにちは、{name}さん");
}
実行結果はこのようになります。リストの中身が順次処理されていることがわかります。
こんにちは、佐藤さん
こんにちは、鈴木さん
こんにちは、高橋さん
for文
for文は、繰り返す回数を明確に指定したいときや、インデックス(要素の順番)を使って処理を行いたいときに便利です。
実務ではforeach文ほど頻繁には使いませんが、「最初の3件だけ処理したい」「偶数番目の要素だけを取り出したい」といった場面では役立ちます。
以下のように細かくループの条件を指定することができます。
for (初期化; 繰り返し条件; 更新処理)
{
// 繰り返し処理
}
- 初期化:最初に一度だけ実行される(カウンター変数を0にするなど)
- 繰り返し条件:この条件がtrueの間、ループが継続される
- 更新処理:1回のループが終わるたびに実行される(カウンターを増やすなど)
以下は、0~9までの数値をコンソールに表示するサンプルコードです。
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
処理の流れは次の通りです。
- 変数
i
を 0 で初期化する - 繰り返し条件の
i < 10
がtrue
の間だけループを繰り返す - ループ内で
Console.WriteLine(i)
が実行される - 1回のループが終わるごとに
i++
でi
を1増える i
が 10 になると繰り返し条件がfalse
になるので、ループが終了する
while文
while文は条件が満たされる間だけ繰り返す構文で、「何回繰り返すか」が決まっていない処理に適しています。
while (条件)
{
// 条件がtrueの間だけ実行される処理
}
例えば、ユーザーが正しいパスワードを入力するまで処理を繰り返すようなケースでは、回数が決まっていないため、for文等では表現しにくくなります。
以下は、そのような場面を再現したサンプルコードです。
string password = "";
string correctPassword = "正しいパスワード";
// 入力したパスワードが正しいパスワードと一致するまで繰り返す
while (password != correctPassword)
{
Console.Write("パスワードを入力してください:");
password = Console.ReadLine();
if (password != correctPassword)
{
Console.WriteLine("パスワードが違います。もう一度試してください。");
}
}
Console.WriteLine("ログイン成功!");
このようなケースで活躍しますが、他のループ構文に比べると使う機会は少ないので、初めのうちはあまり意識しなくても大丈夫です。
continueとbreak
continue
とbreak
は、各ループ構文の中で使えるキーワードで、特定の条件でループをスキップしたり、ループを途中で終了することができます。
continue
は「その回の処理をスキップして次に進む」、break
は「ループ自体を終了する」という動きをします。
foreach文での使用例を見てみます。
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (var num in numbers)
{
if (num % 2 == 0)
{
continue; // 偶数の場合は処理をスキップ
}
Console.WriteLine(num); // 奇数の場合のみ出力
if (num == 7)
{
break; // 値が7に達したらループを中断
}
}
この場合にコンソールに表示される数値は「1, 3, 5, 7」となります。7に達するとループ処理が終了するので8以降の値は使われません。
実務で使う機会はそこまで多くはないですが、条件に応じた柔軟なループ制御ができるので覚えておきましょう。
foreachを使う際のコツと注意点
実務ではコードの読みやすさやバグを防ぐ書き方を意識することが重要です。
最もよく使うforeachを例に、使う際のコツと注意点を挙げます。
わかりやすい変数名を使う
foreach (var user in users)
のように、変数名には扱うデータの内容が伝わる名前をつけましょう。
単なるx
やy
よりも意味のある名前を使うことでコードの意図が明確になります。
ループの中身はシンプルにする
ループ内に処理を詰め込んだり、ループの中でさらにループするようなネストが深い処理を書くと、非常にコードが読みにくくなります。
「1つのループでたくさんのことをする」のではなく、必要に応じて処理を分割することで、わかりやすいコードとなるように意識しましょう。
nullチェックを忘れずに
リストなどのコレクションがnullだと、foreach実行時にnull参照エラーが発生します。
それを防ぐために、ループ対象のコレクションがnullでないことを事前にチェックするようにしましょう。
if (items != null) // コレクションがnullでないことをチェック
{
foreach (var item in items)
{
// 安全に処理
}
}
ループ中にコレクションを変更しない
foreachループ中にリストなどのコレクションを変更(要素の追加や削除)しようとすると、実行時にエラーが発生します。
var numbers = new List<int> { 1, 2, 3 };
foreach (var num in numbers)
{
numbers.Remove(num); // × ループ中の要素の変更はNG
}
どうしてもループ中にコレクションを変更したい場合は、foreach文ではなくfor文を使いましょう。
まとめ
C#のループ構文の中でも、foreachは「すべての要素を順に処理したい」ときに最も使いやすい構文です。
一方で、ループ回数の制御やインデックスが必要な場合にはfor文、終了条件が動的な場合にはwhile文と、状況に応じた使い分けが重要です。
次回は「演算子の基本」について解説します。