記事内に広告が含まれています

C#入門③|ループ構文(foreach・for・while)の基本

C#入門③ C#入門

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

C#入門② | 条件分岐(if・switch・三項演算子)の基本
前回の「C#入門①」では、変数とデータ型について学びました。 今回は、if文、switch文、switch式、三項演算子など、C#でよく使われる条件分岐の基本的な書き方を解説します。 実務でも役立つ読みやすいコードを書くための工夫も紹介しま...

今回は、実務でも特によく使われる「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

continuebreakを使うと、特定の条件でループをスキップしたり、ループを途中で終了することができます。

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) のように、変数名には扱うデータの内容が伝わる名前をつけましょう。

単なるxyよりも意味のある名前を使うことでコードの意図が明確になります。

ループの中身はシンプルにする

ループ内に処理を詰め込んだり、ループの中でさらにループするようなネストが深い処理を書くと、コードが読みにくくなったり、あとで修正しづらくなったりします。

「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の使い分け」について解説します。

C#入門
hiranote

コメント

タイトルとURLをコピーしました