この記事ではC#の「for文」の使い方を紹介します。プログラミングにおいて「同じ処理を繰り返し行いたい」動作によく使うコードです。ソースコードを大幅に効率化できる便利なものなので、この記事を読んで使いこなせるようにしましょう。
C#の「for文」は、ループ処理・繰り返し処理を行うためのステートメント(構文)です。プログラミングでは「同じ処理を繰り返し行いたい」場面がよくあります。for文を使うと、同じ処理を「指定した回数」もしくは「条件を満たすまで」繰り返すことができるので、同じソースコードを何度も書く必要がありません。
for文をうまく活用すれば、ソースコードを大幅に簡潔化・効率化することも可能。一方でfor文によるループ処理には、どのように活用すればいいか分かりづらいことや、ループの終了方法に戸惑うことがあります。そこで本記事では、C#のfor文の使い方を解説します。for文を活用した応用テクニックもご紹介するので、ぜひ参考にしてみてください。
目次
C#の「for文」とは、同じ処理を繰り返し行うためのステートメント(機能)です。プログラミングをしていると、「同じ処理を繰り返し行いたい」ことがよくあります。そんなとき、ひとつずつ手作業で同じソースコードを書いていると、以下の例みたいに冗長になってしまいます。
//サンプルプログラム |
//実行結果 |
上記のサンプルコードでは計算結果自体が合っているものの、計算する過程においてひとつずつ手作業で足していっているため、ソースコードが冗長です。そこで「for文」を使うと、以下のように簡潔なソースコードが書けるようになります。
//サンプルプログラム |
このようにfor文を使って同じ処理を何度も行うことを、「繰り返し処理」や「ループ処理」と呼びます。C#のプログラミングは「for文なしでは成り立たない」と言っても過言ではないほど、繰り返し処理・ループ処理は重要な要素です。
C#のfor文(forループ)の基本的な書き方と構文について、以下3つのポイントから詳しく解説します。
for文・forステートメントの基本的な書き方・構文は以下のとおりです。
C#のfor文には「初期化式」「条件式」「反復式」という3つの要素があり、これがループ処理の振る舞いを決定します。それぞれの式の意味や実行されるタイミング・回数は以下のとおりです。
式の種類 | 式の意味 | 式の実行タイミングと回数 |
---|---|---|
初期化式 | ループ処理内で使う変数の初期化 主に「ループカウンター」を初期化する |
ループ前の1回のみ実行 |
条件式 | ループ処理が行われる条件 条件式がtrueの間は処理が繰り返されて falseになるとループ処理が終了する |
ループの反復前に毎回実行 |
反復式 | 次の繰り返し処理へ移るための状態変化 主にループカウンターを加算・減算することで 条件式の結果をfalseに近づけていく |
ループの反復後に毎回実行 |
ちなみに「ループカウンター」とは、ループが何回行われているかカウントしたり、条件式を評価する際に使用したりする変数のことです。for文では基本的にループカウンターが必須なので、初期化式で「int i = 0」のように宣言します。以下のサンプルコードで、for文によるループ処理の基本的な書き方を確認してみましょう。
//サンプルプログラム |
//実行結果 |
上記のサンプルプログラムでは、「0から9」までの整数値をひとつずつ表示しています。for文の書き方に注目して、どのような条件を設定しているか見てみましょう。
初期化式は「int i = 0」、条件式は「i < 10」、反復式は「i++」となっていますね。これはループカウンター「i」をループ前に生成・初期化し、その「i」が10になるまでループ処理を繰り返すということです。なお、繰り返し処理が行われるたびに、「i」をインクリメントつまり1ずつ増やしています。
ループカウンター「i」の初期化はfor文に入る前の1回のみ行われ、ループ処理を行う前に毎回「iが10未満かをチェック」します。そのうえで、ループ処理を行ったあとに、毎回「iをインクリメントする」という流れです。その結果、画面上に0から9までの値が表示されます。
なお本記事では、ループカウンターとして「i」という変数名を使っていますが、「number」や「counter」など自由な名前を使っても構いません。しかし、一般的にはループカウンター自体には意味がないため、「i」「j」「k」など単純なものを使うことが多いです。
C#のfor文で最もわかりづらくミスが起きやすいのは「条件式」の部分です。条件式を正しく記載しなければ、ループ回数が意図したものより多くなったり少なくなったりなど、意図したとおりに動かなくなります。以下のサンプルコードで確認しましょう。
//サンプルプログラム |
//実行結果 |
for文の条件式は、「その結果がtrueのうちはループが繰り返される」という意味です。したがって、「for (int i = 0; i < 10; i++)」と書いた場合は、「i」が0~9の間しか繰り返されません。10も表示したい場合は、「i=10」のときもループ処理が行われるように、条件式を「i <= 10」もしくは「i < 11」とする必要があります。 また「for (int i = 0; i > 10; i++)」のように、そもそもループカウンターの初期値が条件式の範囲外の場合は、ループが1度も実行されずに終了してしまうので注意が必要です。
これまでは「for (int i = 0; i < 10; i++)」のように、「初期化式でループカウンターをゼロにする」もしくは、「反復式でループカウンターを1つずつインクリメント」という方法でした。しかし実際には、C#の「初期化式」「条件式」「反復式」は自由に変更できます。以下のサンプルコードで確認してみましょう。
//サンプルプログラム |
//実行結果 |
上記のサンプルプログラムでは、「初期化式」「条件式」「反復式」のさまざまな組み合わせで、多様な実行結果を表示しています。カウントアップやカウントダウンはもちろん、数式に基づいた数値も、for文を使えば簡単に表示可能です。
最初はなかなか慣れないかもしれませんが、まずどんな数値を表示して、それをどのように変化させたいのかを考えれば、for文が簡単に書けるようになります。
C#のfor文を使っていると、「ループを最後まで実行せず途中で終了させたい」こともあります。たとえば、特定の値のときだけ処理をスキップしたり、forループそのものを終了させたりするなどがあります。C#のfor文は以下5つの方法で処理をスキップ・終了できます。
forループ内で「continue」というステートメントを記載すると、ただちに処理をスキップして、次の繰り返し処理に移行できます。以下のサンプルコードで詳細を確認してみましょう。
//サンプルプログラム |
//実行結果 |
上記のサンプルプログラムでは、if文で「i == 5」のときだけ分岐させて、「continue」しています。そのため画面上に「5」は表示されず、それ以外の数値は通常どおり表示されます。if文の判定式は数値だけではなく、ほかのさまざまな型や要素でも、continueさせることが可能です。
//サンプルプログラム |
//実行結果 |
上記の例では、ユーザーが「skip」を入力したときにforループをcontinueするため、そのときだけ表示処理がスキップされます。このように、特定の場合だけループ処理をスキップさせることはよくあるので、continueの使い方を覚えておくと便利です。
forループ内で「break」というステートメントを使うと、forループ自体を終了させることが可能です。以下のサンプルコードで使い方を確認しましょう。
//サンプルプログラム |
//実行結果 |
ループカウンターの「i」が5のときにbreakしたので、5より大きな値が画面上に表示されていません。continueの場合と同じように、breakもさまざまな場面で活用できます。
//サンプルプログラム |
//実行結果 |
本来であれば入力処理が5回行われるはずですが、breakを使うとそれより前にループ処理が終了します。breakによるforループの終了は、後述する「無限ループ」を停止させるときによく使わる方法です。
forループ内で「return」というステートメントを使用すると、forループだけではなく現在のメソッドそのものが終了します。このreturnステートメントは、メソッドで通常使うreturnと同じもので、得られる効果もまったく同じです。詳細を以下のサンプルコードで確認しましょう。
//サンプルプログラム |
//実行結果 |
上記のように、for文のループカウンターが「5」になったときにreturnするようにすると、5以上の値は表示されずにメソッド自体が終了します。先ほどの「break」はforループを終了させるものでしたが、returnはforループだけではなくメソッドそのものを終わらせるのです。
このreturnは後述するように、配列やコレクションなどで特定の値を検出したり、そのインデックスを取得したりするために活用することが多いです。たとえば、配列から特定の要素をfor文で順番に検索し、検索対象の要素が見つかったらただちにreturnして、その要素を返すなどの使い方になります。
「goto」というステートメントを使用すると、forループを終了させてgotoラベルがある場所へ進みます。ただし、gotoは「プログラムの可読性」を低下させて処理を追いづらくなるため、基本的には使わないことが推奨されています。詳細を以下のサンプルコードで確認しましょう。
//サンプルプログラム |
//実行結果 |
gotoを記載したことにより、forループは途中で終了して、gotoラベルがある部分に処理が飛んでいます。breakはforループを終了しますが、gotoはさらに別の部分に飛ぶということです。重要なことは、「FINISHラベル」の前にある「無事に処理が完了されました!」というメッセージが表示されていないことに注目しましょう。
これは処理がgotoラベルに飛んだことにより、その以前にある部分は実行されないことが理由です。このように、gotoはプログラムの処理が追いづらくなることが問題なので、「こんな方法もある」くらいに考えておくといいでしょう。
try-catch文による例外処理をforループで使う場合は、forループを終了させたいときに「throw」ステートメントで例外を投げれば、forループによる繰り返し処理を終了させることができます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム |
//実行結果 |
「Int32.TryParseメソッド」は、文字列が数値に変換できないときに「false」を返します。上記のサンプルプログラムでは、戻り値がfalseのときに例外をthrowして、forループを終了させていることがポイントです。ユーザーが数値に変換できないものを入力すると、例外がthrowされるため、ただちにcatchブロックに飛んでエラーメッセージが表示されます。
for文(forループ)の基本的な使い方を見てきましたが、forループが最も活躍するのが「配列」や「コレクション」と組み合わせたときです。ここからは以下5つの観点から、forループと配列・コレクションの便利な組み合わせ方をご紹介します。
配列の値を設定したり表示したりするときに、forループを活用するとソースコードが簡潔になります。具体的には以下のサンプルコードのとおりです。
//サンプルプログラム |
//実行結果 |
forループの条件式は、配列の範囲外アクセスが起きないように注意してください。配列の「Lengthプロパティ」を使えば、配列の要素数(サイズ)が分かるので、forループを安全に回すことができます。プログラムの仕様変更で配列の要素数が変わったときも、Lengthプロパティを使っておけば安心です。
配列の動的な変更を可能にしたリスト(List)でも、以下のようにforループでより便利に使えるようになります。具体的には以下のサンプルコードのとおりです。
//サンプルプログラム |
//実行結果 |
最初にリストオブジェクトをインスタンス化する以外は、基本的には配列とまったく同じように使えます。リストの場合でも、配列の条件式には「Lengthプロパティ」を使うようにしましょう。
C#の「Dictionaryクラス」は、「キー」と「値」の2つをまとめて格納できる連想配列です。Dictionaryクラスも他のコレクション同様に、for文と組み合わせて便利に使えます。具体的には以下のサンプルコードのとおりです。
//サンプルプログラム |
//実行結果 |
連想配列の場合は単にインデックスでアクセスすることはできないので、キーは「Keys.ToList」・値は「Values.ToList」で、それぞれ個別のリストとして扱う必要があります。
C#でfor文を活用すると、さまざまな方法で配列やコレクションの中から、必要なデータを検索することができます。配列からデータを検索し、その内容を表示するサンプルコードを見ていきましょう。
//サンプルプログラム |
//実行結果 |
上記のサンプルプログラムでは、Dataクラスのstaticメソッド「Find」で、指定されたIDに合致する要素を配列の中から検索し、そのオブジェクトを戻り値として返しています。for文で最初のインデックスからIDを比較していって、合致するものがあればそのままreturnで返すという単純なアルゴリズムです。
なおFindメソッドの戻り値は、指定したものがなければNullオブジェクトを返します。そのままでは、検索できなかった場合にWriteメソッドでアクセスして例外が発生してしまうため、「NULL合体演算子」でダミーオブジェクトを代入しています。
forループを活用すると、配列やコレクションをソートするプログラムも書けます。ソートとは「並べ替え」を意味し、バラバラに並べられたデータを昇順(小さい順)や降順(大きい順)に並べ替えることができます。今回は「バブルソート」という最も単純なソートアルゴリズムを、C#のforループで実装したサンプルコードを見ていきましょう。
//サンプルプログラム |
//実行結果 |
Randomクラスでランダムな「乱数」を発生させています。「Nextメソッド」は、「第1引数」から「第2引数 – 1」までの範囲で、乱数を発生させることが可能。たとえば1から256まで使いたいなら、「Next(1, 257)」とします。
なおバブルソートは、隣り合う要素同士を比較して、順番が逆であれば並び替えるというもの。ソートしたデータがまるで泡のように浮かび上がってくることから、「バブルソート」と名付けられました。なお、ソートアルゴリズムでは「多重forループ」を使うことがほとんどですが、これについては後述します。
これまでご紹介したforループは、あくまでforを1回しか使わない「1重ループ」でした。しかし、C#ではしばしばforループを2回以上行う「多重ループ」もしばしば登場します。本章では、多重forループと多次元配列について、以下3つの観点から解説します。
「多重forループ」とは、forループの中にforループがある処理を指します。先ほどのバブルソートのように、通常のforループではできない高度な処理を行うときに、多重forループが必要なことが多いです。
なお、forループが2つ並んでいるものを「2重forループ」、3つ並んだものを「3重forループ」と呼びます。以下のサンプルコードのように、forループを並べれば「多重forループ」となります。
//サンプルプログラム |
//実行結果 |
上記のサンプルプログラムは、「■」を横に7つ並べ、それを縦に5つ並べるという処理内容です。外側のforループが内側のforループを繰り返すというイメージ。多重forループを使うときは、個別のループカウンターを使う点に注意してください。それぞれ個別の条件判定を行うため、ループカウンターも個別に用意しなければ正常に動作しません。
多重forループにおける「continue」と「break」の挙動は以下のとおりで、ロジック自体は通常のforループの場合と変わりません。
//サンプルプログラム |
//実行結果 |
いずれも1重のforループと同じで、continueは次の繰り返しへ進み、breakはforループ自体を中止します。ちなみに、内側のforループでbreakを使った場合は、以下のように内側のループ処理が終了するだけで、外側には影響は及びません。
//サンプルプログラム |
//実行結果 |
上記のように、内側のforループをbreakしたとしても、中止されるのは内側のforループのみ。外側のforループには影響が及ばないため、次のループ処理が始まります。内側・外側の両方のforループを終えたい場合は、「return」を使う必要があります。
多次元配列は、多重forループと組み合わせると便利です。たとえば、2次元配列の初期化と表示を行うサンプルコードは以下のとおりです。
//サンプルプログラム |
//実行結果 |
C#の多次元配列には、「多次元配列」と「ジャグ配列」の2種類がありますが、今回はジャグ配列を使用しました。ジャグ配列は「配列の配列」とも呼ばれ、いわば配列の中に配列があるイメージです。C++やJavaの多次元配列もこのタイプなので、C#でも基本的にはジャグ配列を使用することをおすすめします。
C#のジャグ配列は、宣言時に「int [][]」のように「[]」を2つ並べ、インスタンス生成時は最上位の要素数のみ指定します。そのうえでforループを回して、ひとつずつ内側のオブジェクトを追加していくことがポイントです。
値を格納するときや表示するときは、先ほどご紹介した多重forループを回します。まず最上位の次元からforループを回し、次に低い次元のforループを回しましょう。その結果、上記の画面のような、2次元配列を可視化した画面が表示されます。多重forループは扱い方が難しいですが、ひとつずつ慎重に進めていくことが重要です。
C#でfor文を使う際は、「無限ループ」にならないよう注意しましょう。無限ループとは、いつまでも続いて終わりがない繰り返し処理・反復処理のこと。実はfor文では、「初期化式」「条件式」「反復式」は、書かなくても動作してしまうため、以下のように条件式を書き忘れると、無限ループになってしまいます。加えて、手動で「×」ボタンを押さないとプログラムを終了できないので、実行時は注意してください。
//サンプルプログラム |
//実行結果 |
「×」ボタンを押して手動でプログラムを終了させない限り、いつまでも数字が表示され続けます。
forループで式の中身を書かずに「;(セミコロン)」だけ記載すると、その式は評価されません。「for ( ; ; )」のようにすべて省略することも可能です。無限ループは危険ではありますが、以下のサンプルプログラムのようにあえて無限ループを作り出し、特定の条件下で「break」させるという手法はよく使われます。
//サンプルプログラム |
//実行結果 |
上記のサンプルコードでは、無限ループ内でユーザーの入力を求め続けて、「quit」が入力されたらbreakするという内容です。このような処理は、たとえばゲームや基幹システムなどのような、常時稼働してリアルタイムで入力処理を受け付けるようなプログラムで、広く活用されています。
C#で「for文」以外にループ処理を行う方法について、以下5つの選択肢をご紹介します。いずれも有効な方法なので、ケースバイケースで使い分けることが重要です。
「while文」は、forループ同様にループ処理・繰り返し処理を行うためのステートメントです。while文の構文は以下のとおりです。
//サンプルプログラム |
//実行結果 |
条件式を「while (true)」にすると、条件式の結果が常に「true」になるため無限ループとなります。この場合はforループと同じように、breakで無限ループを抜ける手段を用意することが必須です。ちなみに無限ループを使う場合は、基本的にfor文よりwhile文を使うことの方が多いでしょう。
「do-while文」は先ほどのwhile文によく似たステートメントですが、while文とは異なり「必ず1回は実行される」ことがポイントです。while文の構文は以下のとおりになります。
条件式のみ指定する点は、先ほどのwhileループとまったく同じです。しかし、最初に「do」という部分があり、そのあとにループ処理の内部、最後に先ほどと同じwhile文を記載します。詳細を以下のサンプルコードで確認しましょう。
//サンプルプログラム |
//実行結果 |
do-while文の「必ず1回は実行される」という性質は、「ユーザーのキー入力を受け付ける」ときに役立ちます。なぜなら、キー入力は必ず1回は受ける必要があり、不正値が入力されたときは再入力を求める必要があるからです。条件式で不正値を検出するようにすると、あとは通常のwhileループと同じように「不正値が入力されたら再入力を促す」という処理ができます。
C#には配列やコレクションの全要素にアクセスできる「foreach文」が用意されており、構文は以下のとおりです。
//サンプルプログラム |
//実行結果 |
通常のfor文とは異なり、条件式と反復式を設定しなくていいので簡潔なループ文が書けます。ただしループカウンターを使用しないため、ループ内でインデックスにアクセスすることはできません。要素の「インデックス」が必要な場合は、外部でループカウンターを別途用意するか、通常のforループを使うことをおすすめします。
先ほどのforeach文とは異なり、コレクションには「ForEachメソッド」が用意されています。
//サンプルプログラム |
//実行結果 |
ラムダ式を使って、WriteLineメソッドで値を表示するデリゲートを作成していることがポイントです。なお配列を表示したい場合は、以下のようにLINQの「ToListメソッド」を使用します。
//サンプルプログラム |
//実行結果 |
ToListメソッドを使用すると、配列をリスト形式へ簡単に変更できます。あとは先ほどと同じように、ForEachメソッドにデリゲートを渡せば、簡潔な繰り返し処理が行えるでしょう。
C#の「クエリ式(LINQ)」を使うことでも、foreach文と同じ効果が得られるソースコードが書けます。ちなみにクエリ式とは、データベースを統合的に扱うための、便利な機能です。クエリ式(LINQ)を活用した繰り返し処理の構文は、以下のとおりです。
クエリ式の構文は独特なところがあるため、慣れるまではわかりづらいことも多いでしょう。以下のサンプルコードで、クエリ式の使い方を紹介します。
//サンプルプログラム |
//実行結果 |
SQL風のコードが書ける「クエリ式」と、よりC#に近い感覚で使える「メソッド呼び出し」の2種類の書き方があります。メソッド呼び出しの場合は、C#の構文に比較的近くなり、Whereメソッドで条件を指定し、Sumメソッドで和を求めるという流れです。ただし、いずれにせよLINQは独特の構文を覚える必要があるため、基本的には通常のforeach文を使うほうが良いでしょう。
C#の「for文・forループ」は、繰り返し処理を行うための構文です。実際にプログラミングを行うときは、同じ処理を複数回繰り返すことが増えます。とくに配列を使うときは、値の代入や表示などの際に、forループが役立ちます。forループの活用方法はさまざまで、要素の検索やソートなどにも利用可能です。
またforループは、break・continue・returnなどのステートメントで、処理の中断や終了などが自由に行えます。ループ処理を行う手段は、while文やforeach文などさまざま存在するので、必要に応じて使い分けるようにしましょう。この機会にぜひfor文・forループを活用して、より効率的なソースコードが書けるようにしましょう。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール