[C#] 多次元配列とジャグ配列(配列の配列)の違い

2021年2月4日(更新: 2022年6月30日)

C#では、通常の配列(一次元配列)の他に、多次元配列ジャグ配列(配列の配列)を定義することができます。

これらの違いについて書き留めておきます。

多次元配列

C#において、多次元配列は以下のように定義できます(以下、定義は関数内で行っていると仮定します)。

// 行数
int row = 5;
// 列数
int col = 10;
// 5行10列の二次元配列
int[,] array = new int[row, col];

角括弧([])の中のカンマを増やせば、配列の次元も増えます。

宣言と同時に中身を定義する場合、いくつかの書き方がありますが、例えば以下のように書けます。

int[,] array = new int[,] { 
  { 1, 2 },
  { 3, 4 },
  { 5, 6 },
  { 7, 8 }
};

多次元配列の要素にアクセスする場合は、カンマで区切ってインデックス値を入れます。以下は上記の多次元配列の要素にアクセスする例です。

print(array[0, 1]) // 1行目の2列目の要素(=2)を出力
print(array[2, 0]) // 3行目の1列目の要素(=5)を出力
array[3, 1] = 10; // 4行目の2列目の要素(=8)を 10 で上書き

C#の多次元配列の注意点

注意すべき点は、多次元配列は要素数が固定であり、ある行の要素数を他の行のそれと異なる数にすることはできません

要素数は固定であるため、どこかの行の要素だけ三つの要素を入れるといったことはできません。以下はエラーになります。

int[,] array = new int[,] { 
  { 1, 2 },
  { 3, 4 },
  { 5, 6 },
  { 7, 8, 9 } // これはダメ
};

長さの違う一次元配列を複数入れられる配列を作りたい場合、以下で紹介するジャグ配列を使用します。

ジャグ配列(配列の配列)

ジャグ配列は「ある一次元配列の要素として他の一次元配列が入る配列」と言えます。以下のように定義できます。

// 入る一次元配列の数
int childArrayNum = 5;
// 5個の一次元配列を入れられるジャグ配列
int[][] array = new int[childArrayNum][];

他の言語では、この定義によって多次元配列ができる場合があるので混同しないように注意が必要です。

ジャグ配列では多次元配列とは異なり、要素数の異なる配列を持つことができます。

以下はジャグ配列の定義例です。

// 定義方法その1
// 2つの一次元配列が入るジャグ配列を用意
int[][] array = new int[2][];
// 中身となる一次元配列を定義
array[0] = new int[] { 1, 2, 3, 4, 5 };
array[1] = new int[] { 6, 7, 8, 9, 10 };

// 定義方法その2
// 中身となる配列とその要素を同時に定義
int[][] array = new int[][]
{
new int[] { 1, 2, 3 },
new int[] { 4, 5 },
new int[] { 6, 7 },
new int[] { 8, 9, 10 }
};

「定義方法その2」によって、要素数が異なる4つの一次元配列を含んだ一次元配列(つまりジャグ配列)ができます。

ジャグ配列の要素である特定の一次元配列を取り出したり、ある配列の中にある特定の要素にアクセスしたりするには以下のように記述します。

// 「定義方法その2」のジャグ配列の要素にアクセスする例

// 4つ目の配列を取り出す
int[] line4array = array[3];
// 3つ目の配列を別の配列で置き換える
array[2] = new int[] { 11, 12, 13 };
// 2つ目の配列の2番目の要素(=5)を出力
print(array[1][1]);

ちなみに、ジャグ配列の要素として多次元配列を入れるということも可能ですが、これらの違いを理解していないと混乱する恐れがあるのでご注意ください。

以上、C#における多次元配列とジャグ配列の違いについてでした。

参考

コメントを残す

メールアドレスが公開されることはありません。