【C#】配列を使えるようになろう

# ■目次
[１．はじめに](#１はじめに)
[２．配列とは](#２配列とは)
[３．一次元配列](#３一次元配列)
　　[３－１．一次元配列の作り方](#３１一次元配列の作り方)
　　[３－２．一次元配列の要素へのアクセス方法](#３２一次元配列の要素へのアクセス方法)
　　[３－３．配列の変更](#３３配列の変更)
　　　　[３－３－１．要素の変更](#３３１要素の変更)
　　　　[３－３－２．配列の初期化](#３３２配列の初期化)
　　[３－４．ループで一次元配列を処理する](#３４ループで一次元配列を処理する)
　　[３－５．Listクラス](#３５listクラス)
　　　　[①要素の追加](#要素の追加)
　　　　[②要素の挿入](#要素の挿入)
　　　　[③要素の削除](#要素の削除)  
　　　　[【応用】Listを使って入力された複数データを処理する](#応用listを使って入力された複数データを処理する)
[４．多次元配列](#４多次元配列)
　　[４－１．二次元配列](#４１二次元配列)
　　　　[４－１－１．二次元配列の作り方](#４１１二次元配列の作り方)
　　　　[４ー１ー２．二次元配列の要素へのアクセス方法](#４１２二次元配列の要素へのアクセス方法)
　　　　[４ー１ー３．ループで二次元配列を処理する](#４１３ループで二次元配列を処理する)
　　[４－２．三次元配列](#４２三次元配列)
　　　　[４－２－１．三次元配列の作り方](#４２１三次元配列の作り方)
　　　　[４－２－２．三次元配列の要素へのアクセス方法](#４２２三次元配列の要素へのアクセス方法)
　　　　[４－２－３．ループで三次元配列を処理する](#４２３ループで三次元配列を処理する)
    
[５．配列と一緒に使うと便利なプロパティ・メソッド](#５配列と一緒に使うと便利なプロパティメソッド)
　　[５－１．Lengthプロパティ](#５１lengthプロパティ)
　　[５－２．Splitメソッド](#５２Splitメソッド)
　　[５－３．string.Joinメソッド](#５３stringjoinメソッド)
　　[５－４．Array.Resizeメソッド](#５４arrayresizeメソッド)
[６．まとめ](#６まとめ)

# １．はじめに
配列に苦戦するプログラミング初心者の方は多いのではないでしょうか。
しかし、配列には多くのメリットがあり、システム開発に大きく役立ちます。
この記事ではC#で配列の使い方を説明します。
なお、C#の概要については下記、当社の過去記事を参考にしてみてください。

https://qiita.com/ta-k_nt/items/c4dc5a7885ababe13f7e

本記事に記載のサンプルコードの実行環境はPaizaCloudを使用しており、コンパイラは下記が使用されています。

>Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-2 Wed Feb 26 23:41:24 UTC 2020)

# ２．配列とは
配列とは、同じ型の複数データをメモリ上連続的に並べたデータ構造です。
配列中の各データを配列の「**要素**」と呼び、「**インデックス**」と呼ばれる番号で識別します。
配列には下記のようなメリットがあります。

:::note info
メリット
・プログラムが簡潔になる
・効率的に大量のデータを扱える
・メモリの利用効率が良くなる
　など
:::

主な使用例は「**Excelのような表データ処理**」です。
次項から詳しく配列の使い方を見ていきましょう。

# ３．一次元配列
一次元配列とは、下記のような一行に同一型の複数データを格納したデータ構造です。
配列名をarray、インデックスをiとすると、配列の各要素は下記のように表します。

| array[0] | array[1] | array[2] |...|array[i]|
|:-:|:-:|:-:|:-:|:-:|
|要素1   | 要素2  | 要素3  |...|要素i|

:::note warn
注意点
・配列の先頭の要素のインデックスは**0**です。
:::

#### ３－１．一次元配列の作り方
配列は宣言と初期化をすると作ることができます。
一次元配列を宣言するには下記のように記述します。

【構文】
```markdown
データ型[] 配列名;
```
【サンプルコード】
```c#
//配列の宣言
int[] intArray;
string[] strArray;
```

次に一次元配列の初期化方法は複数あります。
ここでは3パターン紹介します。

**①パターン１**
【構文】
```markdown
データ型[] 配列名 = new データ型[要素数];
配列名[0] = 値;
配列名[1] = 値;
…
```
【サンプルコード】
```c#
string[] array = new string[3];
array[0] = "株式会社";
array[1] = "NEXT";
array[2] = "TECHNOLOGY";
```

**②パターン２**
【構文】
```markdown
データ型[] 配列名 = new データ型[要素数][要素1,要素2,要素3...];
```
【サンプルコード】
```c#
string[] array = new string[3] {"株式会社","NEXT","TECHNOLOGY"};
```

**③パターン３**
配列の長さは{}に指定した要素数となります。

【構文】
```markdown
データ型[] 配列名 = [要素1,要素2,要素3...];
```
【サンプルコード】
```c#
string[] array = {"株式会社","NEXT","TECHNOLOGY"};
```

#### ３－２．一次元配列の要素へのアクセス方法

一次元配列の各要素へアクセスするためには下記のように表します。
```markdown
配列名[インデックス番号]
```

下記は３－１で作成した配列の要素を出力するコードです。
繰り返しとなりますが、注意点は配列の先頭の要素のインデックスは**0**である点です。
３－１のいずれのパターンで配列を作成しても出力結果は同じです。

【サンプルコード】
```c#
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
Console.WriteLine(array[2]);
```
【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```

#### ３－３．配列の変更

###### ３－３－１．要素の変更
配列の各要素の値は変更したい値を代入すると変更できます。
【サンプルコード】
```c#
//配列作成
string array[3] = {"株式会社", "NEXT", "TECHNOLOGY"};

//変更値の代入
array[1] = "ネクスト";
array[2] = "テクノロジー";

//出力
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
Console.WriteLine(array[2]);
```
【出力結果】
```markdown
株式会社
ネクスト
テクノロジー
```

###### ３－３－２．配列の初期化

配列はnewを使って初期化し再定義することができます。

```c#
//配列作成
string[] array = new string[3] {"株式会社","NEXT","TECHNOLOGY"};

//配列初期化
array = new string[2];
array[0] = "ネクスト";
array[1] = "テクノロジー";

//出力
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
```
【出力結果】
```markdown
ネクスト
テクノロジー
```

#### ３－４．ループで一次元配列を処理する
配列は、ループと組み合わせると効率よくデータを処理することができます。
ここではforとforeachを使って一次元配列の各要素を表示するサンプルコードを紹介します。
なお、forループ処理で使用するLengthプロパティについては[こちら](#５１lengthプロパティ)をご確認ください。

【for】
```c#
using System;
using System.Collections;
public class Sample{
    public static void Main(){
        //配列作成
        string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};

        //要素数分ループ
        for(int i = 0; i < array.Length; i++){
            //該当要素の出力
            Console.WriteLine(array[i]);
        }        
    }
}
```
<!--
:::note info
ポイント
・Lengthプロパティで配列の要素数を取得する。
・配列をarray、ループ変数をiとするとループ回数は 
　**i < array.Length**
:::
-->

【foreach】
```c#
using System;
using System.Collections;
public class Sample{
    public static void Main(){
        //配列作成
        string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};

        //要素数分ループ
         foreach (string arr in array){
            //該当要素の出力
            Console.WriteLine(arr);
         }
    }
}
```
<!--
:::note info
ポイント
・配列をarrayとすると、foreach内で配列の各要素を格納する変数を
　別途用意する。ここではarrとする。
　**foreach(string arr in array)**
:::
-->

【出力結果】
出力結果はfor、foreachどちらも同じです。
```markdown
株式会社
NEXT
TECHNOLOGY
```

#### ３－５．Listクラス
Listは、順序付けられた同じデータ型の要素の集合を管理する**コレクション**のクラスで、配列のような使い方ができます。
配列とコレクションには下記のような違いがあります。
|  | 配列 |コレクション|
|:-:|:-:|:-:|
| 要素数  | 固定  |可変|
|  使用メモリ | 少ない  |多い|

コレクションについて詳しくは下記をご参照ください。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/collections

Listは要素数が可変なため、標準入力から受け取った値など、要素数が不定なデータの処理に便利です。
Listクラスを使うには下記の名前空間を使用します。
```c#
using System.Collections.Generic;
```
リストオブジェクトの作り方は下記の通りです。

```c#
// List<データ型> オブジェクト名 = new List<データ型>();
List<int> lst = new List<int>();    //intの場合
List<string> lst = new List<string>(); //stringの場合
```

リストの要素にはメソッドを使って下記のような操作ができます。
[①要素の追加](#要素の追加)
[②要素の挿入](#要素の挿入)
[③要素の削除](#要素の削除)

###### ①要素の追加
Addメソッドを使います。

【構文】
```markdown
リスト変数.Add(追加したい要素);
```
【サンプルコード】
```c#
//リスト作成
List<string> lst = new List<string>();

//要素の追加
lst.Add("株式会社");
lst.Add("NEXT");
lst.Add("TECHNOLOGY");

//リストの出力
foreach(string elmnt in lst){
    Console.WriteLine(elmnt);
}
```

【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```
###### ②要素の挿入
Insertメソッドを使用します。
リストの指定した位置にデータを挿入することができます。

【構文】
```markdown
リスト変数.Insert(挿入位置,挿入値);
```
【サンプルコード】
```c#
//リスト作成
List<string> lst = new List<string>();

//要素の追加
lst.Add("株式会社");
lst.Add("TECHNOLOGY");

//要素の挿入
lst.Insert(1,"NEXT");

//リストの出力
foreach(string elmnt in lst){
    Console.WriteLine(elmnt);
}
```

【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```
###### ③要素の削除
Removeメソッドを使います。
指定した要素を削除することができます。

【構文】
```markdown
リスト変数.Remove(削除する要素);
```
【サンプルコード】
```c#
//リスト作成
List<string> lst = new List<string>();

//要素の追加
lst.Add("有限会社");
lst.Add("株式会社");
lst.Add("NEXT");
lst.Add("TECHNOLOGY");

//要素の削除
lst.Remove("有限会社");

//リストの出力
foreach(string elmnt in lst){
    Console.WriteLine(list);
}
```

【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```

#### 【応用】Listを使って入力された複数データを処理する
例として、標準入力に下記データが入力された場合にそれぞれの値を出力するサンプルコードを紹介します。

【入力値】
```markdown
株式会社
NEXT
TECHNOLOGY
```
【サンプルコード】

```c#
using System;
using System.Collections.Generic;

public class Sample{
    public static void Main(){
        //リストの作成
        List<string> lst = new List<string>();
        
        //入力行を格納する変数
        string line;
        
        //入力行がnullでない間、その値をリストに追加
        while ((line = Console.ReadLine()) != null) {
            lst.Add(line);
        }
        
        //リストの出力
        foreach(string elmnt in lst) {
             Console.WriteLine(elmnt);
        }
    }
}
```
【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```

# ４．多次元配列
一次元配列の使い方は理解できたでしょうか。
ここからは多次元配列について説明していきます。

#### ４－１．二次元配列
二次元配列は一次元配列を複数行重ねた構造です。
二元配列は行と列の2つのインデックスで要素を表します。
例えば、下記は行が2、列が3の2次元配列arrayです。
```c#
string array[2][3] = {
    {"座席A", "座席B", "座席C"},
    {"座席E", "座席D", "座席F"}
};
```

各要素は行のインデックスをi、列のインデックスをjとすると下記のように表せます。

<!--
|行/列| array[][0] | array[][1] | array[][2] |
|:-:|:-:|:-:|:-:|
|array[0][]|  座席A | 座席B  | 座席C  |
|array[1][]|  座席E | 座席F  | 座席G  |
-->

|array[i][j]| j = 0 |j = 1  | j = 2 |
|:-:|:-:|:-:|:-:|
|i = 0|  座席A | 座席B  | 座席C  |
|i = 1|  座席E | 座席F  | 座席G  |

例えばarray[1][1]は「座席F」です。

<!--
2次元配列の用途には下記のようなものがあります。

【用途例】
・RPGのマップ
・写真・イラストなどのイメージ
・3D-CGの空間座標
・ゲームの盤面
・表形式データ
-->

#### ４－１－１．二次元配列の作り方
二次元配列の宣言方法は下記の通りです。

```markdown
<!--宣言方法①-->
データ型[][] 配列名;

<!--宣言方法②-->
データ型[,] 配列名;
```
:::note info
ポイント
・多次元配列は次元数を[]の数で表します。(宣言方法①)
・次元数は[]内で,の数でも表すことができます。(宣言方法②)
:::

次に二次元配列の初期化は一次元配列同様に複数あります。
ここでは4パターン紹介します。

**パターン１**

<!--
（基本）配列を宣言、要素数を決めた後に各要素に値を代入する方法。配列の各要素を指定して作成
-->

```c#
string[,] array = new string[2, 3];
array[0, 0] = "座席A";
array[0, 1] = "座席B";
array[0, 2] = "座席C";
array[1, 0] = "座席D";
array[1, 1] = "座席E";
array[1, 2] = "座席F";
```

**パターン２**
<!--配列の宣言と初期化を同時に行う方法-->

```c#
string[,] array = new string[2, 3] {
    {"座席A", "座席B", "座席C"},
    {"座席E", "座席D", "座席F"}
};
```
**パターン３**
```c#
string[][] array = {
   new string[] {"座席A", "座席B", "座席C"},
   new string[] {"座席E", "座席D", "座席F"}
};
```

**③パターン４**
配列の長さは{}に指定した要素の数となります。

```c#
string[,] array = {
    {"座席A", "座席B", "座席C"},
    {"座席E", "座席D", "座席F"}
};
```

#### ４－１－２．二次元配列の要素へのアクセス方法

二次元配列の各要素へアクセスする方法は、配列の宣言方法により異なります。

**【宣言方法①の場合】**
```markdown
配列名[行インデックス][列インデックス]
```
```c#
Console.WriteLine(array[0][0]);
Console.WriteLine(array[0][1]);
```
【出力結果】
```markdown
座席A
座席B
```
**【宣言方法②の場合】**
```markdown
配列名[行インデックス, 列インデックス]
```

```c#
Console.WriteLine(array[1, 0]);
Console.WriteLine(array[1, 1]);
```
【出力結果】
```markdown
座席E
座席D
```

#### ４－１－３．ループで二次元配列を処理する

一次元配列と同様に、二次元配列（多次元配列）もループを使うと効率よくデータを処理することができます。
ここではforとforeachを使って二次元配列の各要素を表示するサンプルコードを紹介します。

**【二次元配列でのLengthの使い方】**
二次元配列でのLengthの使い方のポイントは下記の通りです。

【構文】
```markdown
・配列の行数を取得する　　　：配列.Length
・配列の行の列数を取得する　：配列[行番号].Length
```
【サンプルコード】
```c#
//二次元配列作成
string[][] array = {
   new string[] {"座席A", "座席B", "座席C"},
   new string[] {"座席E", "座席D", "座席F"}
};

//行数出力
Console.WriteLine(array.Length);
//列数出力
Console.WriteLine(array[0].Length);
```
【出力結果】
```markdown
2
3
```

二次元配列のLengthの使い方をおさえた上で、ループで二次元配列の各要素を出力するサンプルコードを見てみましょう。

:::note info
ポイント
・二次元配列のためループは二重となる
:::

【forループ】
```c#
//二次元配列作成
string[][] array = {
   new string[] {"座席A", "座席B", "座席C"},
   new string[] {"座席E", "座席D", "座席F"}
};

//行の要素数分ループ
for(int i = 0; i < array.Length; i++){
    //列の要素数分ループ
    for(int j = 0; j < array[i].Length; j++){
        //末尾に半角スペースを加えて該当要素を出力
        Console.Write(array[i][j] + " ");
    }
    //該当行のすべての要素を出力したところで改行
    Console.WriteLine();
}
```

【foreachループ】
```c#
//二次元配列作成
string[][] array = {
   new string[] {"座席A", "座席B", "座席C"},
   new string[] {"座席E", "座席D", "座席F"}
};

//行の要素数分ループ
foreach(string[] line in array){
    //列の要素分ループ
    foreach(string row in line){
        //末尾に半角スペースを加えて該当要素を出力
        Console.Write(row + " ");
    }
    //該当行のすべての要素を出力したところで改行
    Console.WriteLine();
}
```
【出力結果】
出力結果はfor、foreachどちらも同じです。
```markdown
座席A 座席B 座席C
座席E 座席D 座席F
```

#### ４－１－４．二次元配列でのListクラスの使い方

二次元配列でのListクラスの使い方は下記の流れで使うことができます。
①大本のリストを用意する
②データ追加用のリストを作りデータを追加する。
③②を①に追加する。

```c#
using System;
using System.Collections.Generic;

public class Sample{
    public static void Main(){
        //大本のリスト作成
		List<List<string>> lst = new List<List<string>>();
		
		for (int i = 1; i < 3; i++){
	    	//データ追加用のリストの作成
		    List<string> item = new List<string>();
                
		    //データの追加
		    item.Add("列" + i.ToString());
		    item.Add("座席1");
		    item.Add("座席2");
		    item.Add("座席3");
		        
		    //大本のリストにデータ追加用のリストを追加する
		    lst.Add(item);
		}

		//行の要素数分ループ
		foreach(List<string> line in lst){
		    //列の要素分ループ
		    foreach(string row in line){
                //末尾に半角スペースを加えて該当要素を出力
		        Console.Write(row + " ");
		    }
		    //該当行のすべての要素を出力したところで改行
		    Console.WriteLine();        
		}
    }
}
```

【出力結果】
```markdown
列1 座席1 座席2 座席3 
列2 座席1 座席2 座席3 
```

<!--
###### 【応用】標準入力から2次元配列に割り当てる

```c#
using System;

public class Lesson05
{
    public static void Main()
    {
        int number = int.Parse(Console.ReadLine());

        string[][] table = new string[number][];
        for (int i = 0; i < number; i++)
        {
            table[i] = Console.ReadLine().Split(' ');
        }

        foreach (string[] line in table)
        {
            foreach (string dot in line)
            {
                if (dot == "1")
                {
                    Console.Write("#");
                }
                else
                {
                    Console.Write(" ");
                }
            }
            Console.WriteLine();
        }
    }
}

```
-->

#### ４－２．三次元配列

三次元配列は、二次元配列を積み重ねた構造です。
三元配列は3つのインデックス表します。

下記例は行の要素数が2、列の要素数が3の2次元配列を3つ積み重ねた三次元配列arrayです。
```c#
int[][][] array = {
    new int[][] {
      new int[] {0, 1, 2},
      new int[] {3, 4, 5}
    },
    new int[][] {
      new int[] {6, 7, 8},
      new int[] {9, 10 ,11}
    },
    new int[][] {
      new int[] {12, 13, 14},
      new int[] {15, 16, 17}
    }
};
```

各要素は行のインデックスをi、列のインデックスをjとすると下記のように表せます。

|array[0][i][j]| j = 0 | j = 1 | j = 2 |
|:-:|:-:|:-:|:-:|
|i = 0|  0 | 1  | 2  |
|i = 1|  3 | 4  | 5  | 

<br>

|array[1][i][j]| j = 0 | j = 1 | j = 2 |
|:-:|:-:|:-:|:-:|
|i = 0|  6 | 7  | 8  |
|i = 1|  9 | 10  | 11  |

<br>

|array[2][i][j]| j = 0 | j = 1 | j = 2 |
|:-:|:-:|:-:|:-:|
|i = 0|  12 | 13  | 14  |
|i = 1|  15 | 16  | 17  |

例えばarray[0][1][2]は「5」です。

#### ４－２－１．三次元配列の作り方

三次元配列の宣言方法は下記の通りです。
二次元配列と考え方は同じです。

【構文】
```markdown
//宣言方法①
データ型[][][] 配列名;

//宣言方法②
データ型[,,] 配列名;
```

次に配列の初期化は二次元配列同様に複数ありますが、ここでは１つ紹介します。

【サンプルコード】
```c#
int[][][] array = {
    new int[][] {
      new int[] {0, 1, 2},
      new int[] {3, 4, 5}
    },
    new int[][] {
      new int[] {6, 7, 8},
      new int[] {9, 10 ,11}
    },
    new int[][] {
      new int[] {12, 13, 14},
      new int[] {15, 16, 17}
    }
};
```

<!--
①（基本）配列を宣言、要素数を決めた後に各要素に値を代入する方法
配列の各要素を指定して作成
```c#
int[,,] array = new int[2, 2, 2];

  array[0, 0, 0] = 0;
  array[0, 0, 1] = 1;
  array[0, 1, 0] = 2;
  array[0, 1, 1] = 3;
  array[1, 0, 0] = 4;
  array[1, 0, 1] = 5;
  array[1, 1, 0] = 6;
  array[1, 1, 1] = 7;
```

②配列の宣言と初期化を同時に行う方法
```c#
int[,,] array = new int[2, 2, 2] {
  {
    {0, 1},
    {2, 3}
  },
  {
    {4, 5},
    {6, 7}  
  }
};
```

```c#
int[][][] array = {
    new int[][] {
      new int[] {0, 1},
      new int[] {2, 3}
    },
    new int[][] {
      new int[] {4, 5},
      new int[] {6, 7}
    }
};
-->

#### ４－２－２．三次元配列の要素へのアクセス方法

三次元配列の各要素へアクセスするためには下記のように記載します。
【構文】
```markdown
配列名[二次元配列のインデックス][行インデックス][列インデックス]
```

下記は４－２ー１で作成した配列の要素を出力するコードです。

【サンプルコード】
```c#
Console.WriteLine(array[0][0][0]);
Console.WriteLine(array[0][0][1]);
Console.WriteLine(array[0][0][2]);
Console.WriteLine(array[0][1][0]);
Console.WriteLine(array[0][1][1]);
Console.WriteLine(array[0][1][2]);
Console.WriteLine(array[1][0][0]);
Console.WriteLine(array[1][0][1]);
Console.WriteLine(array[1][0][2]);
...
```
【出力結果】
```markdown
0
1
2
3
4
5
6
7
8
...
```

#### ４－２－３．ループで三次元配列を処理する
ここではforeachループで三次元配列の各要素を出力するサンプルコードを紹介します。

:::note info
ポイント
・三次元配列のためループは三重となる
:::

【サンプルコード】
```c#
using System;

public class Sample{
	public static void Main(){
        //三次元配列作成
		int[][][] array = {
			new int[][] {
			    new int[] {0, 1, 2},
			    new int[] {3, 4, 5}
		    },
			new int[][] {
			    new int[] {6, 7, 8},
			    new int[] {9, 10 ,11}
		    },
		    new int[][] {
			    new int[] {12, 13, 14},
			    new int[] {15, 16, 17}
		    }
	    };

        //二次元配列の要素分ループ
	    foreach (int[][] arr in array){
            //行の要素数分ループ
	    	foreach (int[] line in arr){
                //列の要素数分ループ
		    	foreach (int row in line){
                    //末尾に半角スペースを加えて該当要素を出力
			    	Console.Write(row + " ");
			    }
                //該当行のすべての要素を出力したところで改行
			    Console.WriteLine();
		    }
            //該当二次元配列のすべての要素を出力したところで改行
		    Console.WriteLine();
	    }
    }
}
```

# ５．配列と一緒に使うと便利なプロパティ・メソッド
ここでは配列と一緒に使うと便利なプロパティ・メソッドを4個紹介します。

####  ５－１．Lengthプロパティ
Lengthプロパティを使うと配列の要素数をint型で返します。
配列内に要素がない場合は0を返します。
名前空間Systemに定義されています。

【構文】
```c#
配列.Length
```
【サンプルコード】
```c#
//配列作成
string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};

//配列の要素巣出力
Console.WriteLine(array.Length);
```
【出力結果】
```markdown
3
```

[「３－３．ループで配列を処理する」の解説戻る。](#３３ループで配列を処理する)

#### ５－２．Splitメソッド
Splitメソッドを使うと指定した区切り文字でデータを分けて配列を作ることがで来ます。
名前空間Systemに定義されています。
例えばcsv(カンマ区切り)データを配列にしたい時などに使えます。

【構文】
```c#
元データ.Split('区切り文字');
```

:::note warn
注意点
・Split()内に指定する区切り文字は**シングルクオテーション**（**''**）で囲みます
:::

【サンプルコード】
下記はカンマ(,)で区切られたデータを配列にし出力するサンプルコードです。
```c#
//元データ
string data = "株式会社,NEXT,TECHNOLOGY";

//元データを,で分けて配列に格納
string[] array = data.Split(',');

//配列出力
foreach(string arr in array){
    Console.WriteLine(arr);
}
```
【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```

#### ５－３．string.Joinメソッド
string.Joinメソッドを使うと、配列内の要素を指定した区切り文字で区切って連結することができます。
名前空間Systemに定義されています。

【構文】
```c#
string.Join("区切り文字", 配列)
```
【サンプルコード】
下記は、各要素を半角スペース区切りで連結し出力するサンプルコードです。
```c#
//配列作成
string[] array = {"株式会社", "NEXT", "TECHNOLOGY"};

//各要素を半角スペース区切りで出力
Console.WriteLine(string.Join(" ", array));
```
【出力結果】
```markdown
株式会社 NEXT TECHNOLOGY
```

#### ５－４．Array.Resizeメソッド
Array.Resizeメソッドは配列の長さを変更することができます。
名前空間Systemに定義されています。

【構文】
```markdown
Array.Resize(ref 長さを変更したい配列, 変更後の長さ)
```

構文内の**ref**は値の受け渡し方法の1つで、**参照渡し**と呼ばれます。
基本的な値の受け渡し方法である、**値渡し**と下記のような違いがあります。

>・値渡し： メソッド内で引数の値を書きかえても、呼び出し元には影響しない。
>・参照渡し（ref）： メソッド内での値の書き換えの影響が呼び出し元に伝搬する。

詳しくは下記をご参照ください。

https://ufcpp.net/study/csharp/sp_ref.html

【サンプルコード】
```c#
//配列作成
string[] array = new string[2] {"株式会社","NEXT"};

//リサイズ(現在の長さに+1)
Array.Resize(ref array, array.Length + 1);

//追加した要素に値を代入
array[array.Length - 1] = "TECHNOLOGY";

//配列出力
foreach(string arr in array){
    Console.WriteLine(arr);
}
```
【出力結果】
```markdown
株式会社
NEXT
TECHNOLOGY
```

# ６．まとめ
いかがでしたでしょうか。
配列の学習の参考になれば幸いです。
また、サンプルコードは必要個所を変更してそのまま使えるので是非ご活用ください。