【C#入門】for文を使ったループ処理のテクニック
C#のfor文を使用すると、繰り返し(ループ)処理を実現することができます。ループ処理中は繰り返したい動作を含めて、条件を満たす間は実行され続けます。
この記事では、ループ処理の書き方や停止する方法を解説します。ループ処理はプログラミングの基礎となる部分なので、ぜひ参考にしてみてください。
- プログラマー
- for文を特定の条件で抜けたいのですが、上手く抜けてくれません。アドバイスを頂けないでしょうか?
- プロジェクト
リーダー - for文を抜ける方法はいくつかありますね。どれが適切か、ここで学んでいきましょう。
実行環境
・Windows 10 Home
・Visual Studio Community 2019
for文の書き方と構造
for文はループ処理を実行するための構文となり、構造は以下のとおりです。
1
2
3
|
for(初期化式; 条件式; 反復式){
※繰り返し実行する処理を記述
}
|
【初期化式】
ループ前に1回実行される式です。基本的には変数の初期化処理を行います。
【条件式】
ループの反復前に毎回とおる式です。条件式の結果が真(true)となる場合に、反復処理が継続されます。
【反復式】
ループ内の反復処理が終わるたびに呼ばれる式です。ここで何も変化を持たせないと、条件式を抜けられず、無限ループとなる可能性もあるので注意しましょう。
1
2
3
4
5
6
7
8
|
for(int i=0; i<3; i++)
{
Console.WriteLine($"i = {i}");
}
// → 出力結果は以下となります。
// i = 0
// i = 1
// i = 2
|
for文による変数iの変化はイメージできるでしょうか。
iは初期値0から1ずつ加算され、iが3未満の間は出力処理が繰り返し実行されています。
そのため、「i = 2」までしか出力されていませんね。
for文からのスキップ
breakでスキップ
前項ではfor文の条件式によってループ処理を終了しましたが、breakを使用すると、ループを強制的に終了することもできます。
1
2
3
4
5
6
7
8
9
10
11
12
|
for(int i=0; i<3; i++)
{
if(i % 2 == 0){
Console.WriteLine($"i = {i}");
}else{
break;
}
}
Console.WriteLine($"end.");
// → 出力結果は以下となります。
// i = 0
// end.
|
if文で使用されている「%」は余りを計算する演算子なので、2で割った余りが0(偶数)かそれ以外(奇数)で分岐しています。初期値の0は偶数なのでiが出力されていますが、次の1は奇数なので、breakでfor文を抜けて「end.」が出力されていますね。
continueでスキップ
それでは、breakをcontinueに差し替えるとどうなるでしょうか。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
for(int i=0; i<3; i++)
{
if(i % 2 == 0){
Console.WriteLine($"i = {i}");
}else{
continue;
}
}
Console.WriteLine($"end.");
// → 出力結果は以下となります。
// i = 0
// i = 2
// end.
|
continueの場合は「i = 2」も出力されています。これは、breakが強制的にfor文を抜けるのに対して、continueはfor文を抜けずに次の反復処理を呼び出すためです。
for文の終了
gotoで終了
gotoを使用とすると、プログラムの制御をラベル付きのステートメントに移動することができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int target = 1;
for(int i=0; i<3; i++)
{
if(i == target)
{
goto Hit;
}
Console.WriteLine($"i = {i}");
}
Hit:
Console.WriteLine($"Hit!");
// → 出力結果は以下となります。
// i = 0
// Hit!
|
for文の条件式はiが3未満の間となっていますが、if文の分岐によりiが1と一致したタイミングでfor文を終了し、Hitラベルの位置に処理が移動しています。そのため、「Hit!」が出力されていますね。
returnで終了
returnを使用とすると、メソッドを終了し、呼び出し元に制御が返ります。今回はMain関数から呼び出されるサブメソッドも必要となるため、メソッドの定義も記載しておきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
static int Sub(int target){
for(int i=0; i<10; i++){
if(i == target){
return i;
}
}
return -1;
}
static void Main(string[] args){
int ret = Sub(3);
Console.WriteLine($"ret = {ret}");
}
// → 出力結果は以下となります。
// ret = 3
|
Subメソッド内にreturnが2つありますが、メソッドの最後まで実行された場合、「ret = -1」と出力されるはずです。しかし、「ret = 3」と出力されたということは、for文の途中で抜けていることが分かりますね。
throwで終了
throwは、プログラムの実行中に例外が発生したことを通知します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
string[] list = new string[]{ "1", "2", "A", "3" };
try
{
for (int i = 0; i < list.Length; i++)
{
int val = -1;
if (Int32.TryParse(list[i], out val))
{
Console.WriteLine($"list[{i}] = {val}");
}
else
{
throw new Exception($"list[{i}]は数値ではありません。");
}
}
}
catch (Exception e)
{
Console.WriteLine($"【例外発生】{e.Message}");
}
// → 出力結果は以下となります。
// list[0] = 1
// list[1] = 2
// 【例外発生】list[2]は数値ではありません。
|
Int32.TryParseは数値変換ができない場合、falseを返します。list[2]は“A”で数値変換できないため、throwが呼ばれて、catchでエラーメッセージが表示されています。
- プログラマー
- 解説ありがとうございます。問題の解決策が見えてきました。
- プロジェクト
リーダー - それは良かったです。いきなりfor文を書くのが難しい時は、一度日本語で処理手順を整理するのもおすすめですよ。
C#のループ処理は処理手順が大切です
今回はfor文を使用したループ処理を紹介しました。処理中に問題が発生した場合は、スキップや終了させたいこともあると思います。処理手順を意識してコーディングをしないと、思わぬ不具合を招くこともあるので注意しましょう。
ぜひ紹介したテクニックを活用して、ループ処理を書いてみてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)