C#の配列についてのアウトプット

::: note
C#の配列について学んだことのアウトプットです。
:::
::: note info
確認は .NET9 で行っています。
:::

## 一次元配列
基本の宣言方法です。
```cs
string[] names1 = new string[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", };
```

もう少し省略した宣言方法です。
型の宣言部分を`var`にしています。
```cs
var names1 = new string[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", };
```

さらに省略した宣言方法です。
右辺の型の宣言部分を省略しています。
```cs
var names1 = new[] { "紫咲シオン", "宝鐘マリン", "雪花ラミィ", };
```

アクセス方法はよくある`[位置]`でアクセスします。
```cs
for (var i = 0; i < names1.Length; i++)
{
    Console.Write($"{names1[i]}, ");
}

// 紫咲シオン, 宝鐘マリン, 雪花ラミィ,
```

`^`を位置の前につけることで末尾方向から位置を指定できます。
```cs
for (var i = 1; i <= names1.Length; i++)
{
    Console.Write($"{names1[^i]}, ");
}

// 雪花ラミィ, 宝鐘マリン, 紫咲シオン,
```

## 多次元配列
C#の多次元配列は２種類の宣言方法があります。

ひとつは配列の長さが固定の四角配列という配列で、もうひとつは配列の中にそれぞれ異なる長さの配列を宣言できるジャグ配列という宣言方法です。

### 四角配列
個人的に見慣れない宣言方法で、少し不思議な感じがしました。
配列数になっている部分を次元分カンマ(,)で区切る方法です。

基本の宣言方法です。
```cs
string[,] names2 = new string[,]
{
    { "紫咲シオン", "塩っ子" },
    { "宝鐘マリン", "宝鐘の一味" },
    { "雪花ラミィ", "雪民" },
};
```

型宣言の部分を`var`に変えた宣言方法です。
```cs
var names2 = new string[,]
{
    { "紫咲シオン", "塩っ子" },
    { "宝鐘マリン", "宝鐘の一味" },
    { "雪花ラミィ", "雪民" },
};
```

右辺の型も一次元配列と同様に省略可能です。
```cs
var names2 = new [,]
{
    { "紫咲シオン", "塩っ子" },
    { "宝鐘マリン", "宝鐘の一味" },
    { "雪花ラミィ", "雪民" },
};
```

左辺に型の宣言をした場合、`new`の省略可能です。
```cs
string[,] names2 = 
{
    { "紫咲シオン", "塩っ子" },
    { "宝鐘マリン", "宝鐘の一味" },
    { "雪花ラミィ", "雪民" },
};
```

値の取得が個人的に不思議な感覚で、よくある多次元配列とは異なり、
宣言方法と同様にカンマ(,)で添え字を指定してます。

また、配列の長さが設定された要素数になります。

```cs
Console.WriteLine($"配列の長さ = {names2.Length}");
for (var i = 0; i < 3; i++)
{
    var join2 = $"{names2[i, 0]} - {names2[i, 1]}";
    Console.WriteLine(join2);
}

// 配列の長さ = 6
// 紫咲シオン - 塩っ子
// 宝鐘マリン - 宝鐘の一味
// 雪花ラミィ - 雪民
```

三次元配列以降も次元の数だけカンマ(,)を指定します。
```cs
var names3 = new[, ,]
{
    {
        { "紫咲シオン", "塩っ子" },
        { "百鬼あやめ", "百鬼組" },
    },
    {
        { "宝鐘マリン", "宝鐘の一味" },
        { "兎田ぺこら", "野兎" },
    },
    {
        { "雪花ラミィ", "雪民" },
        { "桃鈴ねね", "ねっ子" },
    },
};

Console.WriteLine($"配列の長さ = {names3.Length}");
for (var i = 0; i < 3; i++)
{
    for (var j = 0; j < 2; j++)
    {
        var join3 = $"{names3[i, j, 0]} - {names3[i, j, 1]}";
        Console.WriteLine(join3);
    }
    Console.WriteLine();
}

// 配列の長さ = 12
// 紫咲シオン - 塩っ子
// 百鬼あやめ - 百鬼組
//
// 宝鐘マリン - 宝鐘の一味
// 兎田ぺこら - 野兎
//
// 雪花ラミィ - 雪民
// 桃鈴ねね - ねっ子
```

### ジャグ配列
ジャグ配列は単純に配列の中に配列を宣言するだけです。
アクセス方法も見慣れた方法です。

```cs
var name4 = new string[][]
{
    new[] { "かつ丼", "天丼", "親子丼" },
    new[] { "ころね", "おかゆ" },
    new[] { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日" },
};
for (var i = 0; i < names4.Length; i++)
{
    for (var j = 0; j < names4[i].Length; j++)
    {
        Console.Write($"{names4[i][j]}, ");
    }
    Console.WriteLine();
}

// かつ丼, 天丼, 親子丼,
// ころね, おかゆ,
// 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日, 日曜日,
```

## 範囲指定
`..`演算子を使用することで、指定の範囲で新たな配列をスライスします。

基本の形です。
```cs
var names5 = new[] 
{ 
    "紫咲シオン", "宝鐘マリン", "雪花ラミィ", 
    "大神ミオ", "戌神ころね", "さくらみこ", 
    "博衣こより"
};
var slice1 = names5[2..5];
var join5 = string.Join(",", slice1);
Console.WriteLine(join5);

// 雪花ラミィ,大神ミオ,戌神ころね
```

末尾の数字を省略すると開始位置から配列の最後までがスライスされます。
```cs
var slice2 = names5[3..];
var join6 = string.Join(",", slice2);
Console.WriteLine(join6);

// 大神ミオ,戌神ころね,さくらみこ,博衣こより
```

先頭の数字を省略すると先頭から指定の位置までがスライスされます。
```cs
var slice3 = names5[..3];
var join7 = string.Join(",", slice3);
Console.WriteLine(join7);

// 紫咲シオン,宝鐘マリン,雪花ラミィ
```

範囲選択でも`^`を使用できます。
```cs
var slice4 = names5[^3..];
var join8 = string.Join(",", slice4);
Console.WriteLine(join8);

var slice5 = names5[..^3];
var join9 = string.Join(",", slice5);
Console.WriteLine(join9);

// 戌神ころね,さくらみこ,博衣こより
// 紫咲シオン,宝鐘マリン,雪花ラミィ,大神ミオ
```

範囲を指定しない場合は全体をスライスします。
```cs
var slice6 = names5[..];
var join10 = string.Join(",", slice6);
Console.WriteLine(join10);

// 紫咲シオン,宝鐘マリン,雪花ラミィ,大神ミオ,戌神ころね,さくらみこ,博衣こより
```

## 配列の持つフィールド(学習したもの)
* Length - 配列の長さ

## 配列の持つ関数(学習したもの)
* ToList - List型に変換