2次元配列とは
C#の配列(Array)は、通常 int[] や string[] のような1次元(直線状)のデータ構造を指します。しかし、Excelのシート、ゲームのマップ、座席表、画像データ(ピクセルグリッド)のように、**行(Row)と列(Column)**を持つ「格子状」または「表形式」のデータを管理したい場合があります。
このようなデータを効率的に扱うために、C#では2次元配列(多次元配列)がサポートされています。
この記事では、2次元配列の宣言、初期化、および要素へのアクセス方法について解説します。
2次元配列の宣言と初期化
2次元配列は、型名の後にカンマ(,)を一つ入れた [,] を付けて宣言します。
1. サイズを指定して宣言
newキーワードで、[行数, 列数]を指定してインスタンスを生成します。
// 3行4列の int 型配列を作成 (中身はすべて 0 で初期化される)
int[,] matrix = new int[3, 4];
2. 宣言と同時に初期化 (推奨)
値が最初から決まっている場合は、{}(初期化子)をネスト(入れ子)にして使用します。この方法は、new int[,] のように型を明示する方法と、var と new [,] で型推論に任せる方法があります。
using System;
public class Array2DInitialization
{
public static void Main()
{
// 3行4列のグリッドデータを宣言と同時に初期化
// { {1行目}, {2行目}, {3行目} }
int[,] gridData = new int[,]
{
{ 10, 11, 12, 13 },
{ 20, 21, 22, 23 },
{ 30, 31, 32, 33 }
};
// var と new [,] を使った型推論でも同じ
// var gridData = new [,]
// {
// { 10, 11, 12, 13 },
// { 20, 21, 22, 23 },
// { 30, 31, 32, 33 }
// };
}
}
要素へのアクセス:[行, 列]
2次元配列の要素にアクセスするには、1次元配列の[i]とは異なり、[行インデックス, 列インデックス] のようにカンマ区切りで2つのインデックスを指定します。
インデックスは、行も列も0から始まります。
コード例:値の読み取りと書き込み
映画館の座席表(string型)を例に、特定の座席の情報を読み取り、別の座席の情報を書き換える(予約済みにする)例です。
using System;
public class Array2DAccessExample
{
public static void Main()
{
// 座席表 (2行3列)
string[,] seatLayout = new string[,]
{
{ "A-1", "A-2", "A-3" },
{ "B-1", "B-2", "B-3" }
};
// 1. 値の読み取り (0行目, 1列目)
string seat_A2 = seatLayout[0, 1];
Console.WriteLine($"[0, 1] の座席: {seat_A2}"); // A-2
// 2. 値の書き込み(変更) (1行目, 2列目)
Console.WriteLine($"[1, 2] を変更前: {seatLayout[1, 2]}"); // B-3
seatLayout[1, 2] = "Reserved"; // "B-3" を "Reserved" に上書き
Console.WriteLine($"[1, 2] を変更後: {seatLayout[1, 2]}"); // Reserved
}
}
出力結果:
[0, 1] の座席: A-2
[1, 2] を変更前: B-3
[1, 2] を変更後: Reserved
ループ処理:GetLength メソッド
2次元配列のすべての要素を処理(反復処理)するには、forループを2重(ネスト)にするのが一般的です。
ここで注意が必要なのは、1次元配列の.Length(総要素数)ではなく、GetLength(int dimension)メソッドを使用する点です。
array.GetLength(0): 第1次元の長さ(行数)を返します。array.GetLength(1): 第2次元の長さ(列数)を返します。
コード例:2重ループによる全要素の出力
using System;
public class Array2DLoopExample
{
public static void Main()
{
int[,] gridData = new int[,]
{
{ 10, 11, 12, 13 },
{ 20, 21, 22, 23 },
{ 30, 31, 32, 33 }
};
// GetLength(0) で行数を取得 (この例では 3)
int rowCount = gridData.GetLength(0);
// GetLength(1) で列数を取得 (この例では 4)
int colCount = gridData.GetLength(1);
Console.WriteLine($"行数: {rowCount}, 列数: {colCount}");
Console.WriteLine("--- グリッドデータ一覧 ---");
// 外側のループ (行: i)
for (int i = 0; i < rowCount; i++)
{
// 内側のループ (列: j)
for (int j = 0; j < colCount; j++)
{
// [i, j] でアクセス
int value = gridData[i, j];
Console.Write($"{value} "); // Write で改行せずに出力
}
Console.WriteLine(); // 1行が終わるごとに改行
}
}
}
出力結果:
行数: 3, 列数: 4
--- グリッドデータ一覧 ---
10 11 12 13
20 21 22 23
30 31 32 33
まとめ
2次元配列は、C#で表形式のデータを扱うための基本的なデータ構造です。
new int[行数, 列数]またはnew [,] { ... }で初期化します。- 要素へのアクセスは
myArray[行, 列]とカンマで区切ります。 - ループ処理で各次元の長さを取得するには、
GetLength(0)(行数)とGetLength(1)(列数)を使用します。
