C#の繰り返し処理について学んだことをアウトプットしていきます。
動作の確認は.NET9で行っています。
while文
条件に一致している間、処理を繰り返します。
一致しない場合は処理を行いません。
そのため、最初の判定で不一致であった場合、処理回数は0になります。
var names = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };
var index = 0;
Console.Write("処理1:");
while (index < names.Length)
{
Console.Write($"{names[index++]}, ");
}
Console.WriteLine();
var index2 = 0;
Console.Write("処理2:");
while (index2 != 0)
{
Console.Write($"{names[index2++]}, ");
}
// 処理1:紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
// 処理2:
do文
do
文はwhile
文と似ていますが、処理の最後に判定を行うため、少なくとも処理が1回は実行されます。
var names2 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };
var index3 = 0;
Console.Write("処理1:");
do
{
Console.Write($"{names2[index3++]}, ");
}
while (index3 < names.Length);
Console.WriteLine();
var index4 = 0;
Console.Write("処理2:");
do
{
Console.Write($"{names2[index4++]}, ");
}
while(index4 == 0);
// 処理1:紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
// 処理2:紫咲シオン,
for文
for
文は3つのセクションに分かれており、それらを設定することでwhile
、do
文よりも細かな繰り返し処理が行えます。
セクションは以下の通りです。
- 初期処理
- 繰り返し条件
- 後処理
初期処理
初期処理は処理の先頭で一度だけ実行されます。
主に繰り返しカウンターの生成などに利用されます。
繰り返し条件
この条件に一致する間、繰り返し処理を行います。
後処理
繰り返し処理の最後に実行されます。
主に繰り返しカウンターの増減に利用されます。
後処理は後述のcontinue
では処理をしますが、break
で処理をしません。
記述方法
for (初期処理; 繰り返し条件; 後処理)
{
処理;
}
var names3 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };
for (var i = 0; i < names3.Length; i++)
{
Console.Write($"{names3[i]}, ");
}
// 紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
あまり機会はないと思いますが、ブロックを省略することも可能です。
その際は末尾に;
が必要です。
var names4 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };
for (var i = 0; i < names3.Length; Console.Write($"{names4[i++]}, "));
// 紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
更に機会は少ないと思いますが、後処理は,
区切りで複数指定が可能です。
var names5 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね", };
var names6 = new[] { "沙花叉クロヱ", "兎田ぺこら", "桃鈴ねね", "白上フブキ", "猫又おかゆ", };
for (int i = 0, j = 0; i < names5.Length; i++, j++, Console.WriteLine())
{
Console.Write($"{names5[i]} - ");
Console.Write($"{names6[j]}");
}
// 紫咲シオン - 沙花叉クロヱ
// 宝鐘マリン - 兎田ぺこら
// 雪花ラミィ - 桃鈴ねね
// 大神ミオ - 白上フブキ
// 戌神ころね - 猫又おかゆ
各セクションは省略が可能で、例えば条件を省略すると無限ループします。
var names7 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね", };
for (int i = 0; ; i++)
{
if (i >= names7.Length)
{
break;
}
Console.Write($"{names7[i]}, ");
}
// 紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
foreach
System.Collections.IEnumerable
またはSystem.Collections.Generic.IEnumerable<T>
インターフェイスを実装している型(配列やList
など)のデータを順番に取得していき、最後のデータになるまで繰り返し処理をします。
記述方法
foreach (データ型 取得したデータを入れる変数 in 対象となるデータ)
{
処理
}
var names8 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね", };
Console.Write("処理1:");
foreach (var name in names8)
{
Console.Write($"{name}, ");
}
Console.WriteLine();
var names9 = new List<string>
{
"沙花叉クロヱ", "兎田ぺこら", "桃鈴ねね", "白上フブキ", "猫又おかゆ",
};
Console.Write("処理2:");
foreach (var name in names9)
{
Console.Write($"{name}, ");
}
// 処理1:紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
// 処理2:沙花叉クロヱ, 兎田ぺこら, 桃鈴ねね, 白上フブキ, 猫又おかゆ,
また、List
型にはForEach
という関数も用意されており、こちらでも同様の繰り返し処理が行えます。
どちらがスマートな書き方なのかはわかりませんが、個人的には関数を使用する方が好きです。
var names10 = new List<string>
{
"沙花叉クロヱ", "兎田ぺこら", "桃鈴ねね", "白上フブキ", "猫又おかゆ",
};
names10.ForEach(name =>
{
Console.Write($"{name}, ");
});
// 沙花叉クロヱ, 兎田ぺこら, 桃鈴ねね, 白上フブキ, 猫又おかゆ,
Dictionary
型でも処理が可能です。
データには変数.key
、変数.value
でアクセスできます。
var members = new Dictionary<string, string>
{
{ "紫咲シオン", "塩っ子" },
{ "宝鐘マリン", "宝鐘の一味" },
{ "雪花ラミィ", "雪民" },
};
foreach (var member in members)
{
Console.WriteLine($"{member.Key}のファンネームは{member.Value}です。");
}
// 紫咲シオンのファンネームは塩っ子です。
// 宝鐘マリンのファンネームは宝鐘の一味です。
// 雪花ラミィのファンネームは雪民です。
continue
繰り返し処理を中断し、処理の先頭に戻ります。
この時、for
文では後処理を行います。
var points = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < points.Length
; Console.WriteLine($"処理した数値は{points[i]}です。\n", i++))
{
if (points[i] % 2 != 0)
{
Console.WriteLine("これは奇数です。");
continue;
}
Console.WriteLine("これは偶数です。");
}
// これは奇数です。
// 処理した数値は1です。
//
// これは偶数です。
// 処理した数値は2です。
//
// これは奇数です。
// 処理した数値は3です。
//
// これは偶数です。
// 処理した数値は4です。
//
// これは奇数です。
// 処理した数値は5です。
//
// これは偶数です。
// 処理した数値は6です。
//
// これは奇数です。
// 処理した数値は7です。
//
// これは偶数です。
// 処理した数値は8です。
//
// これは奇数です。
// 処理した数値は9です。
//
// これは偶数です。
// 処理した数値は10です。
break
繰り返し処理を中断し、処理を抜けます。
この時、for
文では後処理を行いません。
var points2 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < points2.Length
; Console.WriteLine($"処理した数値は{points2[i]}です。\n", i++))
{
if (points2[i] % 2 != 0)
{
Console.WriteLine("これは奇数です。");
if (points2[i] == 5)
{
break;
}
continue;
}
Console.WriteLine("これは偶数です。");
}
// これは奇数です。
// 処理した数値は1です。
//
// これは偶数です。
// 処理した数値は2です。
//
// これは奇数です。
// 処理した数値は3です。
//
// これは偶数です。
// 処理した数値は4です。
//
// これは奇数です。