C#の繰り返し処理についてのアウトプット

:::note info
C#の繰り返し処理について学んだことをアウトプットしていきます。
:::
:::note info
動作の確認は.NET9で行っています。
:::

## while文
条件に一致している間、処理を繰り返します。
一致しない場合は処理を行いません。

そのため、最初の判定で不一致であった場合、処理回数は０になります。

```cs:C#
var names = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };

var index = 0;
Console.Write("処理１：");
while (index < names.Length)
{
    Console.Write($"{names[index++]}, ");
}

Console.WriteLine();

var index2 = 0;
Console.Write("処理２：");
while (index2 != 0)
{
    Console.Write($"{names[index2++]}, ");
}

// 処理１：紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
// 処理２：
```

## do文
`do`文は`while`文と似ていますが、処理の最後に判定を行うため、少なくとも処理が１回は実行されます。

```cs:C#
var names2 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };

var index3 = 0;
Console.Write("処理１：");
do
{
    Console.Write($"{names2[index3++]}, ");
}
while (index3 < names.Length);

Console.WriteLine();

var index4 = 0;
Console.Write("処理２：");
do
{
    Console.Write($"{names2[index4++]}, ");
}
while(index4 == 0);

// 処理１：紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
// 処理２：紫咲シオン,
```

## for文
`for`文は３つのセクションに分かれており、それらを設定することで`while`、`do`文よりも細かな繰り返し処理が行えます。

セクションは以下の通りです。
* 初期処理
* 繰り返し条件
* 後処理

### 初期処理
初期処理は処理の先頭で一度だけ実行されます。
主に繰り返しカウンターの生成などに利用されます。

### 繰り返し条件
この条件に一致する間、繰り返し処理を行います。

### 後処理
繰り返し処理の最後に実行されます。
主に繰り返しカウンターの増減に利用されます。

後処理は後述の`continue`では処理をしますが、`break`で処理をしません。

### 記述方法
```cs:C#
for (初期処理; 繰り返し条件; 後処理)
{
    処理;
}
```

```cs:C#
var names3 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };

for (var i = 0; i < names3.Length; i++)
{
    Console.Write($"{names3[i]}, ");
}

// 紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
```

あまり機会はないと思いますが、ブロックを省略することも可能です。
その際は末尾に`;`が必要です。
```cs:C#
var names4 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね" };

for (var i = 0; i < names3.Length; Console.Write($"{names4[i++]}, "));

// 紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
```


更に機会は少ないと思いますが、後処理は`,`区切りで複数指定が可能です。
```cs:C$
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]}");
}

// 紫咲シオン - 沙花叉クロヱ
// 宝鐘マリン - 兎田ぺこら
// 雪花ラミィ - 桃鈴ねね
// 大神ミオ - 白上フブキ
// 戌神ころね - 猫又おかゆ
```

各セクションは省略が可能で、例えば条件を省略すると無限ループします。
```cs:C#
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`など)のデータを順番に取得していき、最後のデータになるまで繰り返し処理をします。


### 記述方法
```cs:C#
foreach (データ型 取得したデータを入れる変数 in 対象となるデータ)
{
    処理
}
```
```cs:C#
var names8 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", "大神ミオ", "戌神ころね", };

Console.Write("処理１：");
foreach (var name in names8)
{
    Console.Write($"{name}, ");
}

Console.WriteLine();

var names9 = new List<string> 
{ 
    "沙花叉クロヱ", "兎田ぺこら", "桃鈴ねね", "白上フブキ", "猫又おかゆ", 
};

Console.Write("処理２：");
foreach (var name in names9)
{
    Console.Write($"{name}, ");
}

// 処理１：紫咲シオン, 宝鐘マリン, 雪花ラミィ, 大神ミオ, 戌神ころね,
// 処理２：沙花叉クロヱ, 兎田ぺこら, 桃鈴ねね, 白上フブキ, 猫又おかゆ,
```

また、`List`型には`ForEach`という関数も用意されており、こちらでも同様の繰り返し処理が行えます。
どちらがスマートな書き方なのかはわかりませんが、個人的には関数を使用する方が好きです。

```cs:C#
var names10 = new List<string> 
{ 
    "沙花叉クロヱ", "兎田ぺこら", "桃鈴ねね", "白上フブキ", "猫又おかゆ", 
};

names10.ForEach(name =>
{
    Console.Write($"{name}, ");
});

// 沙花叉クロヱ, 兎田ぺこら, 桃鈴ねね, 白上フブキ, 猫又おかゆ,
```

`Dictionary`型でも処理が可能です。
データには`変数.key`、`変数.value`でアクセスできます。

```cs:C#
var members = new Dictionary<string, string>
{
    { "紫咲シオン", "塩っ子" },
    { "宝鐘マリン", "宝鐘の一味" },
    { "雪花ラミィ", "雪民" },
};

foreach (var member in members)
{
    Console.WriteLine($"{member.Key}のファンネームは{member.Value}です。");
}

// 紫咲シオンのファンネームは塩っ子です。
// 宝鐘マリンのファンネームは宝鐘の一味です。
// 雪花ラミィのファンネームは雪民です。
```

## continue
繰り返し処理を中断し、処理の先頭に戻ります。
この時、`for`文では後処理を行います。

```cs:C#
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`文では後処理を行いません。

```cs:C#
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です。
// 
// これは奇数です。
```