多次元配列は行と列のような格子状(グリッド)にデータを配置する配列です。C# では int[,] のようにカンマで区切った型表記を使います。
GetLength(0) と GetLength(1) を使ってネストループで全要素を走査できるRank プロパティで次元数を確認できる2 次元配列は行(row)と列(column)の組み合わせでデータを管理します。座標系のグリッドやゲームのマップデータなどに使われます。
3 行 4 列の int[,] matrix。matrix[行, 列] の形でアクセスします。
書式:2 次元配列の宣言
1
型[,] 変数名 = new 型[行数, 列数];
| 要素 | 説明 |
|---|---|
型[,] |
2 次元配列の型。カンマの数が次元数を示す |
new 型[行数, 列数] |
指定したサイズの配列を生成(すべて初期値) |
1
int[,] matrix = new int[3, 4]; // 3 行 4 列(すべて 0)
1
2
3
4
5
int[,] matrix = {
{ 1, 2, 3, 4 }, // 行 0
{ 5, 6, 7, 8 }, // 行 1
{ 9, 10, 11, 12 } // 行 2
};
書式:2 次元配列の要素アクセス
1
配列[行インデックス, 列インデックス]
1
2
3
4
5
6
7
8
9
10
11
int[,] matrix = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
Console.WriteLine(matrix[0, 0]); // 1(左上)
Console.WriteLine(matrix[1, 2]); // 7
Console.WriteLine(matrix[2, 3]); // 12(右下)
matrix[0, 0] = 99; // 値の書き換え
GetLength(0) で行数、GetLength(1) で列数を取得してネスト for ループで全要素を走査します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int[,] matrix = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }
};
int rows = matrix.GetLength(0); // 3
int cols = matrix.GetLength(1); // 4
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
Console.Write($"{matrix[i, j],3}");
}
Console.WriteLine();
}
// 1 2 3 4
// 5 6 7 8
// 9 10 11 12
1
2
Console.WriteLine(matrix.Rank); // 2(2 次元配列)
Console.WriteLine(matrix.Length); // 12(全要素数 = 3 × 4)
カンマを増やすことで 3 次元以上の配列も宣言できます。
1
2
3
4
// 3 次元配列(奥行き × 行 × 列のようなイメージ)
int[,,] cube = new int[2, 3, 4];
Console.WriteLine(cube.Rank); // 3
Console.WriteLine(cube.Length); // 24(2 × 3 × 4)
実用上は 2 次元を超える多次元配列はあまり使われません。代わりにジャグ配列(次のページ)やクラスで表現するのが一般的です。
型[,] で 2 次元配列を宣言し、new 型[行数, 列数] または初期化子で初期化する配列[行, 列] でアクセスするGetLength(0) で行数、GetLength(1) で列数を取得するRank で次元数、Length で全要素数を確認できるint[,] grid = new int[5, 3] の行数・列数・全要素数はそれぞれいくつですか?matrix[1, 2] と matrix[2, 1] は同じ要素を指しますか?行数 5、列数 3、全要素数 15(GetLength(0)=5, GetLength(1)=3, Length=15)
1
2
3
4
5
6
int[,] matrix = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
int sum = 0;
for (int i = 0; i < matrix.GetLength(0); i++)
for (int j = 0; j < matrix.GetLength(1); j++)
sum += matrix[i, j];
Console.WriteLine(sum); // 21
matrix[1, 2] は 行1・列2、matrix[2, 1] は 行2・列1 を指します。ジャグ配列 では、行ごとに長さが異なる配列を学び、多次元配列との使い分けを確認します。