前回の「C#入門②」では、C#入門② | 条件分岐(if・switch・三項演算子)の基本について学びました。

今回は、実務でも特によく使われる「foreach文」を中心に、繰り返し処理の基本と書き方のコツをわかりやすく解説します。
3つのループ構文
まずは代表的な3つのループ構文の概要と、それぞれの書き方を見てみます。
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未満である間、ループが繰り返されます。
ループ内では i
の値をコンソールに出力し、その後 i
を1つ増やします。
この処理を i
が10になるまで繰り返し、10に達した時点でループを終了します。
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
は「ループ自体を終了する」という動きをします。
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文と、状況に応じた使い分けが重要です。
次回は「配列とListの使い分け」について解説します。