C#言語で配列の宣言・初期化・代入する方法について解説します。
【はじめに】配列とは
配列(Array)とは、同じ型のデータを(メモリ上に)一列に並べたものです。
プログラミングでは大量のデータを扱う場合によく用いられます。
動画解説
本ページの内容は以下動画でも解説しています。
変数との違い
変数と配列との違いを住宅で例えると下記の通りです。
– | 説明 |
---|---|
変数 | 変数とは、住宅で例えると「一軒家」のようなものです。 変数1つ1つにバラバラの住所があります。 下の画像の例ならEnglish、Math、Sscienceという3つの世帯(実際はint型のデータ)がバラバラの住所(実際はメモリ番地)に存在します。 |
配列 | 一方、配列とはマンションのようなものです。1つの住所に複数の世帯が住んでいます。下の画像の例ならScoreというマンション(配列)に3つの世帯(実際はint型のデータ)が1つの住所(実際は連続するメモリ番地)に格納されています。 |
配列の用語
配列でよく使われる用語とその意味は下記の通りです。
– | 説明 |
---|---|
配列要素 | 配列内のデータ1つずつのことです。先程のマンションで例でいうと、Score[0]、Score[1]、Score[2]の中にあるint型のデータを指します、 |
添え字 | 配列要素を区別するための番号( [0]、[1]、[2]…)のことです。配列番号や要素番号ともいいます。 |
要素数 | 配列の要素の数です。下画像の例なら、配列Scoreの要素数は3となります。(Score[0]、Score[1]、Score[2]の3つあるから) |
配列と変数の違い(詳細)
先程は住宅で例えましたが、変数と配列との違いをちゃんと説明すると、「データがメモリ上に一列に並べられているかどうか」です。
変数で複数のデータを扱う場合は、その個数分だけ変数を用意する必要があります。
変数を複数宣言した場合、それぞれの変数はメモリ上にバラバラに配置されます。
一方、配列の場合は、複数のデータをメモリ上に一列に並べることができます。
これにより、各々のデータへ効率よくアクセスできるというメリットがあります。
【配列】宣言・初期化・代入
配列を使用する際は、まず宣言を行う必要があります。
【書式】
型[] 配列名 = new 型[要素数];
【例】
int[] score = new int[3];
【配列の中身】
| int | int | int |
要素数3のint型の配列を宣言しています。
配列の初期化
変数を宣言する際に、同時に初期値を与えることができます。
これを「配列の初期化」といいます。
初期化する際は、初期値をカンマ( , )で区切って括弧{ }内に並べます。
並べる初期値の個数は宣言した要素数に合わせる必要があります。
(要素数3なら初期値も3つ与える)
【例】
int[] score = new int[] {100, 97, 78};
【配列の中身】
| 100 | 97 | 78 |
score[0]に100、score[1]に97、score[2]に78がそれぞれ格納されます。
配列の代入
宣言した配列にデータを入れることを「配列への代入」といいます。
代入を行うと初期化したときのデータは消えます。(上書きされる)
【例】
score[0] = 50; score[1] = 70; score[2] = 80;
【注意】
配列の要素を指定する添え字の数は、
0 ~ (要素数 -1)
となります。
【例】
要素数が3の場合は、有効な添え字は0~2となります。
※添え字は1~3だと間違えることが多いので注意
別の型の値は代入できない
変数と同じく、配列でも異なる型で宣言した配列に対して異なる型の値は代入できません。
(例)int型の配列にchar型のデータを代入したりなどはできない
【var型配列】宣言・初期化・代入
C#のvar型は、コンパイル時に型の評価が自動的に行われます。
例えば、var型で宣言した配列に整数を代入すると、整数型の配列になります。
【書式】
var array = new [ ]{要素1, 要素2, ..., 要素n};
サンプルプログラムのソースコードは下記の通りです。
ただし、一度整数を代入した後に文字列を代入するとエラーがでます。
例)
var array = new [ ]{1, 2, 3, 4, 5}; array[0] = "エクスカリバー"; // エラーになる
【文字列型の配列】宣言・初期化・代入
C#で文字列型の配列扱う場合、宣言・初期化・代入方法をまとめると以下の通りです。
【書式】
型[] 配列名 = new 型[要素数];
【例】
string[] name = new v[3];
【配列の中身】
| string | string | string |
要素数3のstring型の配列を宣言しています。
配列の初期化
変数を宣言する際に、同時に初期値を与えることができます。
これを「配列の初期化」といいます。
初期化する際は、初期値をカンマ( , )で区切って括弧{ }内に並べます。
並べる初期値の個数は宣言した要素数に合わせる必要があります。
(要素数3なら初期値も3つ与える)
【例】
string[] name = new string[] {"吹雪", "白雪", "深雪"};
【配列の中身】
| 吹雪 | 白雪 | 深雪 |
name[0]に吹雪、name[1]に白雪、name[2]に深雪がそれぞれ格納されます。
配列の代入
宣言した配列にデータを入れることを「配列への代入」といいます。
代入を行うと初期化したときのデータは消えます。(上書きされる)
【例】
name[0] = "大鳳"; name[1] = "武蔵"; name[2] = "加賀";
【注意】
配列の要素を指定する添え字の数は、
0 ~ (要素数 -1)
となります。
【例】
要素数が3の場合は、有効な添え字は0~2となります。
※添え字は1~3だと間違えることが多いので注意
別の型の値は代入できない
変数と同じく、配列でも異なる型で宣言した配列に対して異なる型の値は代入できません。
(例)string型の配列にchar型のデータを代入したりなどはできない
【2次元配列】宣言、初期化、代入
通常の配列は、データを1列に並べるため、1次元配列です。
それに対して、2次元配列は縦横の2次元で配列を考えます。
2次元で配列を考えると、ゲームのマップや画像など、2次元のデータを扱う際には非常に便利です。
動画解説
本ページの内容は以下動画でも解説しています。
2次元配列の宣言
2次元配列を使用する際は、まず宣言を行う必要があります。
【書式】
型[,] 配列名 = new 型[ 縦の要素数 ][ 横の要素数 ];
【宣言例】
int[,] score = new int[2][3];
※要素数が2×3のint型の2次元配列を宣言
【配列の中身】
| int | int | int | | int | int | int |
配列の初期化
2次元配列を宣言する際に、同時に初期値を与えることができます。
これを「2次元配列の初期化」といいます。
初期化する際は、初期値をカンマ( , )で区切って括弧{ }内に並べます。
並べる初期値の個数は宣言した要素数に合わせる必要があります。
(要素数2×3なら初期値は6個必要)
【例】
using System; using System.Collections.Generic; using System.Linq; public class Test { public static void Main () { // 配列の宣言 int[, ] score = new int[2, 3] { { 10, 20, 30 }, { 40, 50, 60 } }; Console.WriteLine (score[0, 0]); // 10 Console.WriteLine (score[0, 1]); // 20 Console.WriteLine (score[0, 2]); // 30 Console.WriteLine (score[1, 0]); // 40 Console.WriteLine (score[1, 1]); // 50 Console.WriteLine (score[1, 2]); // 60 } }
上記の例だと、score[0][0]に10、score[0][1]に20、score[0][2]に30、score[1][0]に40、score[1][1]に50、score[1][2]に30がそれぞれ格納されます。
| 10 | 20 | 30 | | 40 | 50 | 60 |
配列の代入
宣言した配列にデータを入れることを「配列への代入」といいます。
代入を行うと初期化したときのデータは消えます。(上書きされる)
【代入の例】
score[0, 0] = 50; score[0, 1] = 70; score[0, 2] = 80;
【注意】
配列の要素を指定する添え字の数は、
0 ~ (要素数 -1)
となります。
【例】
要素数が3の場合は、有効な添え字は0~2となります。
※添え字は1~3だと間違えることが多いので注意
また、2次元配列でもint型の配列にchar型のデータを代入することはできません。
【連想配列】ハッシュテーブル
連想配列とは、キーを指定して、値を設定する配列です。
ハッシュテーブルとも呼ばれます。
通常の配列では、要素の指定を「数字(インデックス)」で行います。
連想配列では、要素の指定を任意の値(文字列や数値)で行います。
C#では、Dictionaryクラスを使うことで連想配列を使用できます。
【補足】
Dictionary<string, int>で(キー, 値)の型を指定します。
キーも値も文字列ならDictionary<string, string>にします。
【配列操作】配列の長さ(要素数)
C#では、配列の長さ(要素数)を取得するのにLengthを使います。
【書式1】1次元配列の場合
配列名.Length 返り値:要素数
【書式2】多次元配列の場合
配列名.Length 返り値:要素の個数
【書式3】多次元配列の場合
配列名.GetLength(次元数) 返り値:各次元の配列数
【配列操作】配列を文字列に変換
C#では、Joinメソッドで配列を文字列に変換できます。
【書式】
string 変数名 = string.Join("区切り文字", 配列名);
変数には文字列が格納されます。
【配列操作】要素の順序反転
C#では、Array.Reverseメソッドで配列の要素の順序を反転できます。
【書式】
Array.Reverse(配列名);
【配列操作】空要素(null)を一括削除
配列から空要素(null)のみを除去したい場合があります。
しかし、配列の要素数は固定なので、特定の要素のみ削除できません。
そこで、要素数を変動できるリストに一度変換し、そこで空要素のみ削除してから配列に戻してやります。
– | 手順 |
---|---|
① | 配列をリストに変換 |
② | リストのRemoveメソッドでnull要素のみ削除 |
③ | リストを配列に変換する。 |
方法1
※2つ以上nullがある場合は先頭に近いnull要素1つだけ削除します。
using System; using System.Linq; using System.Collections.Generic; public class Test { public static void Main() { // 配列の宣言 var array = new[] {"沖田", null, "モードレッド"}; // 配列→リスト List<string> list = new List<string>(array); // 空要素(null)を削除 list.Remove(null); // リスト→配列 var array2 = list.ToArray(); // 配列の中身表示 foreach (var a2 in array2) Console.WriteLine(a2); // 沖田, モードレッド } }
方法2
※2つ以上nullがある場合も全てのnull要素を削除します。
using System; using System.Linq; using System.Collections.Generic; public class Test { public static void Main() { // 配列の宣言 var array = new[] {"沖田", null, null, "モードレッド"}; // 配列→リスト Listlist = new List (array); // 空要素(null)を一括削除 list.RemoveAll(item => item == null); // リスト→配列 var array2 = list.ToArray(); // 配列の中身表示 foreach (var a2 in array2) Console.WriteLine(a2); // 沖田, モードレッド } }
【配列操作】foreach文で要素を取得
foreach文とは、配列の要素数だけ繰り返し処理を行える文です。
配列の要素値を1つずつ取り出す際に便利です。
【書式】
foreach (型 変数名 in 配列名) { 処理; }
【処理内容】
①指定した配列の要素数だけ繰り返し処理が発生
②1回繰り返しが行われる毎に、指定した変数に、要素の値が代入されていきます。
(例)2回目の繰り返し処理中は、変数に2番目の要素値が入る
今回は、foreach文を用いて、配列内の要素をコンソールに出力して確認してみます。
コメント