C#での配列の宣言の仕方

今後、仕事でC#を使うのでC#を勉強しているのだが、配列の理解が浅いと思ったので、学んだことを記載していく。

## 配列の宣言の仕方
配列を宣言する方法は2つある。

### ただ配列を宣言する(A)

『(型名) [] 変数名』
のように宣言する。

(例)

```csharp
int [] ArrayValueName;
string [] ArrayValueName2;
```

これだと、定義した配列がただ宣言されただけである。
そこで、この配列を使えるようにするためには、配列の数を指定しないといけない。

配列の数は
「(配列の変数名) = (配列の数)」
のように指定する。

(例)

↓↓↓↓↓↓↓ あなたの記事の内容
~~~
ArrayValueName = new int[10];
ArrayValueName2 = new string[3];
~~~
───────
```csharp
ArrayValueName = 10;
ArrayValueName2 = 3;
```
↑↑↑↑↑↑↑ 編集リクエストの内容

こうすることで配列の長さを取得したり、配列に値を指定することができたりできる。

### 初期値を指定して配列を定義する。(B)
(A)の方法とは別に、配列の要素数などを明示的に宣言することができる。


(例)
数値型で、要素数が5の配列を宣言したい時

```csharp
var data = new int[] {1,2,3,4,5};
```

「`(変数の型) (変数名) = new (型名)[] {};`」
のようにすることで、これ1行で配列の定義と配列の初期値を宣言できる。

特にこだわりがなければ、大体(B)のように定義することが多い。

## 配列の要素にアクセスする

```csharp
(配列の変数名)[(アクセスしたい番号)]
```

でアクセスしたい要素にアクセスできる。

(例)

```csharp
data[1]  // dataの1番めの「2」にアクセスできる
data[0] // dataの0番目の「1」にアクセスできる 
```

## 配列の要素を変更する

```csharp
(配列の変数名)[(アクセスしたい番号)] = (変更後の値)
```

で変更したい要素を変更できる。

(例)

```csharp
data[4] = 10;
```

指定したい配列の番号を指定し、 「= (変更したい値)」のようにするだけ。

## 配列の長さを取得する

```csharp
(配列の変数名).Length;
```

でで配列の長さを取得できる。


## 多次元配列
配列の中に配列を含んだ配列を多次元配列という。
多次元配列も宣言する方法が2つある。


### 初期化せずに宣言する方法
「new (型名) [(多次元配列の要素数), (その要素である配列の要素数)]」
のように定義する

(例)配列の要素が2個で、その要素1つにつき、4個の要素を持つ配列を定義したい時

```csharp
var data = new int[2,4];
```


### 配列の宣言と初期化を同時にする方法

(例)配列の要素が3個で、その要素1つにつき、3個の要素を持つ配列を定義したい時

```csharp
var data = new int[,]
{
   { 1, 2, 3 }
  { 4, 5, 6 }
  { 7, 8, 9 }
}
```

中括弧の中に、「,」を記載し、その後の{}で配列を書けばいい。
[]の中に「,」を記載するだけで、その配列が多次元配列であることを表す。


## `List<T>`クラス
※「<(半角)」で囲むとコードとして認識されてしまうので、「＜(大文字)」で書いている。

これまで書いたように、基本的に配列は指定した要素数を越えて配列を追加することはできない。
しかし、実際に使われるデータでは配列が増えることはざらにあるので、なんとか追加したい。
そこで役立つのが、`List<T>`クラス。
この`List<T>`クラスを使うことで、配列に何個でも要素を追加することができる。
ちなみに、この`List<T>`クラスをつけた配列をコレクションという。

基本的に配列を定義する際は、この`List<T>`クラスを使って配列を定義することが多い。


### `List<T>`クラスを使えるようにする</h3>
`List<T>`クラスを使うには、使いたいクラスファイルで

```csharp
using System.Collection.Generic;
```

をコードに記載する。

### `List<T>`クラスのインスタンスを作成する</h3>
配列の宣言と同様に、`List<T>`クラスの配列を宣言するには2つある。

#### ただ`List<T>`クラスの配列を宣言する

```csharp
(変数の型) (変数名) = new List＜型名＞();
```

で配列の要素数が0に`List<T>`型の配列が宣言できる。


(例)
int型で、追加可能な配列を作りたい場合、

```csharp
var data = new List<int>();
```

#### 初期化を伴う`List<T>`クラスの配列を宣言する

(例)string型の`List<T>`クラスの4つのstring型の要素が格納された配列を宣言したい時

```csharp
var data = new List<string>{
  "あいうえお",
  "かきくけこ",
  "さしすせそ",
  "たちつてと",
}; //...(A)
```

### `List<T>`クラスの配列に値を追加する</h3>

```csharp
(配列名).Add(追加したい要素)
```

で追加できる。

(例) (A)にstring型の要素「"たちつてと"」を加えたい場合、

```
data.Add("たちつてと");
```

### `List<T>`クラスの配列の値を削除する</h3>

```csharp
(配列名).Remove(削除したい要素の番号)
```

で削除できる。

(例) dataの0番目の「"あいうえお"」を削除したい場合、

```csharp
data.Remove(0);
```

で削除する。

全部削除したい場合は

```
(配列名).Clear();
```

のようにClearメソッドを使用する。

### `List<T>`クラスの要素数を取得する

```csharp
(配列名).Count;
```

.Lengthではないので注意。

```csharp
data.Count;
```

でdataの要素数(5)が取得できる。

### `List<T>`クラスはクラスオブジェクトを要素に持つことができる
`List<T>`クラスは、int、stringなどもともとある型だけでなく、独自に作成したクラスを型としたオブジェクトを持つことができる。

例えば以下のようなPokemonクラスがあったとする。

```csharp
class Pokemon{
 public string Name { get; set; }
 public string[] Types { get; set; } 

 public Pokemon()
 {
   Name = "";
   Type = new String[]{};
 }
}
```

このPokemonクラスを型とする配列が作れる。
(例)

```csharp
var PokemonGuide = new List<Pokemon>();

var pokemon1 = new Pokemon()
{
  Name = "ピカチュウ",
  Types = new string[] { "でんき" },
};

var pokemon2 = new Pokemon()
{
  Name = "リザードン",
  Types = new string[] { "ほのお", "ひこう" },
};

PokemonGuide.Add(pokemon1);
PokemonGuide.Add(pokemon2);

var pokemon3 = new Pokemon()
{
  Name = "竈門炭治郎",
  Types = new string[] { "みず", "ほのお" },
};

PokemonGuide.Add(pokemon3);
PokemonGuide.Remove(2);
```

追加や削除はそのまま配列名を指定して、AddやRemoveを使えばいい。