ホームに戻る
関連 :
目次 :
C#における配列の取り扱い
C / C++と同様に、C#でも配列(固定長配列)を使用することができる。
ここで、C / C++では宣言時にサイズを固定する必要があるが、C#ではサイズ不定のまま宣言し、初期化時に固定する手法を用いることができる。
注意が必要な点として、C / C++では配列は値型の集合であるのに対し、
C#ではオブジェクト型として取り扱われるため、配列をメソッドの引数とした場合は「参照渡し」となる。
C / C++
// 配列を宣言・初期化 ⇒ サイズ固定、既定値で初期化
int arr1[10];
// 配列を宣言・初期化 ⇒ サイズ固定、初期値を指定
int arr2[10] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};
// 配列を宣言・初期化 ⇒ サイズは初期化子の数で決まる
int arr3[ ] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};
C#
// 配列を宣言 ⇒ サイズなし
// 宣言のみで実体なし
int[] arr1;
// 実体を生成 ⇒ 既定値で初期化
arr1 = new int[10];
// 宣言と初期化を同時に行う ⇒ 既定値で初期化
int[] arr2 = new int[10];
// 配列を生成 ⇒ サイズは初期化子(コンストラクタ引数)の数で決まる
int[] arr3 = new int[] {1, 1, 2, 3, 5, 8, 13, 21, 34, 55};
多次元配列
T[][] はC / C++においては「配列の配列」で、かつ「多次元配列」を意味する。
C#では多次元配列に異なる表記を用い、「配列の配列」と区別する。
C / C++
各次元に"[]"を充て、次元を増やす場合は"[]"を追加する。
// 4 x 3 (4 行 3 列)の配列
int arr1[4][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
{ 10, 11, 12 },
};
// 要素へのアクセス
int val = arr1[3][2]; //< == 12
C#
各次元は "," で区切り、次元を増やす場合は "," を追加する。
// 4 x 3 (4 行 3 列)の配列
int[,] arr1 = new int[,] {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
{ 10, 11, 12 },
};
// 要素へのアクセス
int val = arr1[3, 2]; //< == 12
ヘルパメソッド
C#における配列は IEnumerable<T>インタフェースを実装しているため、自身のメソッドを呼び出すことで配列に対する操作を行うことができる。
また、System.Array クラスには配列を操作するための静的メソッドが実装されている。
以下、その一部を紹介する。尚、これらは配列に限らず、IEnumerable<T>を実装する他のコレクションでも使用可能である。
- Take() : 部分配列の抽出。配列の一部を別の配列とする。
- Concat() : 配列同士の結合。複数の配列を結合し、ひとつの配列とする。
コード例
int[] arr1 = new int[] { 1, 2, 3, 4, };
int[] arr2 = new int[] { 5, 6, 7, };
// arr1 の末尾に arr2 を結合
int[] arr3 = arr1.Concat(arr2).ToArray(); //< arr3 == { 1, 2, 3, 4, 5, 6, 7, }
// arr3 の先頭から 5 要素を抽出
int[] arr4 = arr3.Take(5).ToArray(); //< arr4 == { 1, 2, 3, 4, 5, }
// arr3[3] から arr3[6] までを抽出
Range range = new Range(3, 6);
int[] arr5 = arr3.Take(range).ToArray(); //< arr5 == { 4, 5, 6, 7, }
上記コードにおいて、Concat() や Take() の戻り値は IEnumerable<T> である(配列ではない)点に注意。
配列に戻す場合は ToArray() が必要となる。