演習 - for 反復ループを作成して構成する
- 14 分
表面上、 for ステートメントは、コード ブロックを反復処理し、コードの実行フローを変更できるもう 1 つの反復ステートメントです。 ただし、それぞれの動作を確認したら、各イテレーション ステートメントの微妙な違いと、それらを使用するタイミングをより適切に特定できます。
forステートメントとは
for ステートメントは、特定の回数だけコード ブロックを反復処理します。 このレベルの制御により、他の反復ステートメント間で for ステートメントが一意になります。 foreach ステートメントは、配列やコレクションなどの一連のデータ内の項目ごとに、コード ブロックを 1 回反復処理します。 while ステートメントは、条件が満たされるまでコード ブロックを反復処理します。
さらに、 for ステートメントを使用すると、イテレーションの条件を公開することで、イテレーションのプロセスをより詳細に制御できます。
この演習では、 for ステートメントを使用して、イテレーションの事前条件、完了条件、イテレーション パターンなどを制御する方法を学習します。 また、 for ステートメントの一般的なユース ケースについても学習します。
それでは、コーディング環境を準備し、 for ステートメントを実装するコード サンプルの調査を開始しましょう。
コーディング環境を準備する
このモジュールには、デモ コードをビルドして実行するプロセスをガイドする実践的なアクティビティが含まれています。 開発環境として Visual Studio Code を使用して、これらのアクティビティを完了することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中のプロフェッショナルが使用する開発環境でコードの記述と実行をより快適に行うことができます。
Visual Studio Code を開きます。
Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[ フォルダーを開く] ダイアログで、Windows デスクトップ フォルダーに移動します。
コード プロジェクトを保持するフォルダーの場所が別にある場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。
[フォルダーを開く] ダイアログで、[フォルダーの選択] を選びます。
作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[ はい] を選択します。
Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。
[ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 例えば次が挙げられます。
C:\Users\someuser\Desktop>注
サンドボックスやホスト環境ではなく、自分の PC で作業しており、この C# シリーズの他の Microsoft Learn モジュールを完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている可能性があります。 その場合は、[TestProject] フォルダーにコンソール アプリケーションを作成する次の手順をスキップできます。
ターミナル コマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、次のプロンプトを入力します。
dotnet new console -o ./CsharpProjects/TestProjectこの .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドでは、CsharpProjects および TestProject フォルダーが自動的に作成され、
.csprojファイルの名前として TestProject が使用されます。ファイルが既に存在することを示すメッセージが表示される場合は、次の手順に進みます。 既存のプロジェクト ファイルを再利用します。
エクスプローラー ビューで、 CsharpProjects フォルダーを 展開します。
TestProject フォルダーと、Program.cs という名前の C# プログラム ファイルと TestProject.csproj という名前の C# プロジェクト ファイルの 2 つのファイルが表示されます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[ フォルダーを開く ] ダイアログで、 CsharpProjects フォルダーを選択し、[フォルダーの選択] を 選択します。
エクスプローラー ビューで、TestProject フォルダーを展開し、 Program.csを選択します。
既存のコード行を削除します。
この C# コンソール プロジェクトを使用して、このモジュール中のコード サンプルを作成、ビルド、および実行します。
[ターミナル] パネルを閉じます。
基本的な for ステートメントを記述する
Visual Studio Code が開いていて、[エディター] パネルに Program.cs が表示されていることを確かめます。
注
Program.cs は空になっているはずです。 それがそうでない場合は、すべてのコード行を選択して削除します。
Visual Studio Code エディターに次のコードを入力します。
for (int i = 0; i < 10; i++) { Console.WriteLine(i); }このコードは、コード ブロックを 10 回ループし、
forの現在の値を出力する単純なiステートメントを示します。Visual Studio Code の [ファイル] メニューで、[保存] を選択します。
コードをビルドまたは実行する前に、Program.cs ファイルを保存する必要があります。
[エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、[ TestProject] を右クリックし、[ 統合ターミナルで開く] を選択します。
[ターミナル] パネルが開きます。 ターミナルには、そのターミナルが TestProject フォルダーの場所で開いていることを示すコマンド プロンプトが含まれているはずです。
ターミナル コマンド プロンプトで、コードを実行するには、「 dotnet run 」と入力し、Enter キーを押します。
注
"実行するプロジェクトが見つかりませんでした" というメッセージが表示された場合は、ターミナルのコマンド プロンプトに、予期されている TestProject フォルダーの場所が表示されていることを確かめます。 例:
C:\Users\someuser\Desktop\csharpprojects\TestProject>次の出力が表示されます。
0 1 2 3 4 5 6 7 8 9forステートメントの 6 つの部分を特定するには、1 分かかります。forステートメントには、次の 6 つの部分が含まれています。forキーワード。forのイテレーション条件を定義する括弧のセット。 かっこには、ステートメントの末尾演算子 (セミコロン) で区切られた 3 つの異なる部分が含まれています。- 最初の部分では、反復子変数を定義して初期化します。 この例では、
int i = 0です。 このセクションは初期化 子と呼ばれます。 - 2 番目の部分では、完了条件を定義します。 この例では、
i < 10です。 つまり、forがi未満の場合、ランタイムは引き続き10ステートメントの下のコード ブロック内のコードを反復処理します。iが10と等しくなると、ランタイムはforステートメントのコード ブロックの実行を停止します。 ドキュメントでは、このセクションを条件として参照 します。 - 3 番目の部分では、各イテレーションの後に実行するアクションを定義します。 この場合、各イテレーションの後、
i++はiの値を 1 ずつインクリメントします。 このドキュメントでは、このセクションを反復子として参照 します。 - 最後は、コード ブロックです。 コード ブロックには、イテレーションごとに実行されるコードが含まれています。
iの値がコード ブロック内で参照されていることに注意してください。 ドキュメントでは、このセクションを本文として参照 します。
変数の名前付けの規則を考えると、
iが現在のイテレーションを保持する変数の有効な名前かどうか疑問に思うかもしれません。 この場合、iは最も有効であると見なされます。 その他の一般的な選択肢は、xとcounterです。j名は、forを使用する外部iステートメントがあり、内部forステートメントの反復変数を作成する必要がある場合にも使用されます。注
3 つのセクション (初期化子、条件、反復子) はすべて省略可能です。 ただし、実際には、通常、3 つのセクションがすべて使用されます。
反復条件を変更する
最初に述べたように、 for ステートメントには、反復ステートメントの中で 2 つの固有の特性があります。
forステートメントは、コード ブロックを事前に反復処理する必要がある回数がわかっている場合に使用する必要があります。forステートメントを使用すると、各イテレーションの処理方法を制御できます。
コード ブロックを反復処理する必要があるが、カウントアップするのではなく、カウントダウンする必要がある場合はどうでしょうか。
Visual Studio Code エディターを使用して、次のようにコードを更新します。
for (int i = 10; i >= 0; i--) { Console.WriteLine(i); }更新されたコードを確認するには、少し時間がかかります。
forステートメントの 3 つの部分を変更することで、その動作を変更します。- 反復変数を 10 に初期化します。
forがi未満の場合は、0ステートメントを終了するように完了条件を変更します。- 反復処理を完了するたびに、反復子のパターンを変更して、
1からiを減算します。
コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。出力が変更されていることに注意してください。
コードを実行すると、次の出力が表示されます。
10 9 8 7 6 5 4 3 2 1 0
反復子のパターンを試す
反復子変数内の特定の値を超えてスキップする場合はどうすればよいでしょうか。
Visual Studio Code エディターを使用して、次のようにコードを更新します。
for (int i = 0; i < 10; i += 3) { Console.WriteLine(i); }更新されたコードを確認するには、少し時間がかかります。
1によって反復子変数の値をインクリメントまたはデクリメントするのではなく、i += 3を使用して、各反復処理の後に 2 つの値をスキップします。コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。出力がどのように変化したかに注目してください。
コードを実行すると、次の出力が表示されます。
0 3 6 9確かに、このようなことを頻繁には行いませんが、必要なときにはイテレーションを非常に細かく制御できるということを理解していただけると幸いです。
break キーワードを使用して反復ステートメントを中断する
何らかの条件に基づいて反復ステートメントを途中で終了する必要がある場合はどうなりますか? break キーワードを使用できます。
Visual Studio Code エディターを使用して、次のようにコードを更新します。
for (int i = 0; i < 10; i++) { Console.WriteLine(i); if (i == 7) break; }更新されたコードで
breakキーワードの使用を確認するには、少し時間がかかります。最初に、モジュール 「C# で switch-case コンストラクトを使用してコードのフローを分岐する」で
breakキーワードを確認しました。 結局のところ、breakキーワードを使用して、反復ステートメントを終了することもできます。コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。出力がどのように変化したかに注目してください。
コードを実行すると、次の出力が表示されます。
0 1 2 3 4 5 6 7
配列の各要素をループ処理する
for ステートメントの一般的な使用法は、特に反復処理の実行方法を制御する必要がある場合に、要素の配列を反復処理することです。 foreachは配列のすべての要素を反復処理しますが、forステートメントを調整して、より多くのカスタマイズを提供できます。
Visual Studio Code エディターを使用して、次のようにコードを更新します。
string[] names = { "Alex", "Eddie", "David", "Michael" }; for (int i = names.Length - 1; i >= 0; i--) { Console.WriteLine(names[i]); }更新されたコードを確認するには、少し時間がかかります。
まず、4 つの名前を含む
namesという名前の文字列配列がインスタンス化されていることに注目してください。次に、
Array.Lengthプロパティを使用して配列内の要素の数を取得し、この値を使用して反復子変数 (int i = names.Length - 1) を初期化していることに注意してください。 配列要素のインデックス番号が 0 から始まる (4 つの要素のインデックス番号は 0 から 3) ため、値から 1 を減算します。最後に、
foreachステートメントでは実行できない配列を後方に反復処理することを選択したことに注目してください。 コード ブロック内の反復変数の値を使用して、配列要素のインデックス番号 (names[i]) を指定します。コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。配列要素が (意図したとおりに) 逆の順序で一覧表示されていることに注意してください。
コードを実行すると、次の出力が表示されます。
Michael David Eddie Alex注
次のように
forステートメントを構築することで、配列要素を反復処理できました:for (int i = 0; i < names.Length; i++)。
foreach ステートメントの制限を調べる
foreachイテレーション中に配列内の値を更新する場合はどうしますか?
Visual Studio Code エディターを使用して、次のようにコードを更新します。
string[] names = { "Alex", "Eddie", "David", "Michael" }; foreach (var name in names) { // Can't do this: if (name == "David") name = "Sammy"; }コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。表示されるエラー メッセージに注目してください。
このコードをコンパイルして実行しようとすると、例外が表示されます。
Cannot assign to name because it is a 'foreach iteration variable'つまり、
nameイテレーションの内部実装の一部であるため、foreachの値を再割り当てすることはできません。
for ステートメントを使用して foreach ステートメントの制限を克服する
for ステートメントを使用して、反復処理コード ブロック内の配列の内容を変更してみましょう。
Visual Studio Code エディターを使用して、次のようにコードを更新します。
string[] names = { "Alex", "Eddie", "David", "Michael" }; for (int i = 0; i < names.Length; i++) if (names[i] == "David") names[i] = "Sammy"; foreach (var name in names) Console.WriteLine(name);更新されたコードを確認するには、少し時間がかかります。
コード ブロックから 1 行のコードのみを含む中かっこを削除したことに注目してください。 このリビジョンでは、「C# のコード ブロックを使用して変数スコープとロジックを制御する」モジュールで説明したのと同じ手法を使用します。 多くの開発者は、このスタイルを読むのが難しいと思います。他の開発者は、この省略されたスタイルを好みます。これは、より簡潔でより表現的に書くのに役立つからです。 このコードが読みにくい場合や、このスタイルを好まない場合には、コード ブロック内でいつでも中かっこを使用できるので安心してください。 必要な場合は、エディター パネルのコードを次のコードで更新します。
string[] names = { "Alex", "Eddie", "David", "Michael" }; for (int i = 0; i < names.Length; i++) { if (names[i] == "David") { names[i] = "Sammy"; } } foreach (var name in names) { Console.WriteLine(name); }コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。
[ターミナル] のコマンド プロンプトから「
dotnet run」と入力して、コードを実行します。コードがエラーなしで実行され、目的の出力が生成されます。
コードを実行すると、次の出力が表示されます。
Alex Eddie Sammy Michael配列は反復ステートメントの実装の直接の一部ではないので、配列内の値を変更できます。
まとめ
このユニットのポイントをいくつか次に示します。
forイテレーション ステートメントを使用すると、特定の回数だけコード ブロックを反復処理できます。forイテレーション ステートメントを使用すると、かっこ内の 3 つの条件 (初期化子、条件、反復子) を変更することで、イテレーションのメカニズムのあらゆる側面を制御できます。- 配列内の各項目を反復処理する方法を制御する必要がある場合は、
forステートメントを使用するのが一般的です。 - コード ブロックにコード行が 1 行しかない場合は、必要に応じて中かっこと空白を削除できます。