C# ジャグ配列 – 行ごとに長さが違う2次元配列

2次元配列とは、全ての行と列が同じ長さの配列です。
ジャグ配列とは、2次元配列で各行の長さがバラバラの配列のことです。
ジャグ配列は、配列の中に配列が入っているイメージです。
まず、外側の配列の宣言をしてジャグ配列の行数を決めます。
次に、行ごとにまた配列の宣言をして、列の長さを決めます。
これで、行ごとに長さがバラバラのジャグ配列の宣言ができます。

ジャグ配列の宣言

ジャグ配列の宣言とは、ジャグ配列の型名と名前を決めメモリ上につくることです。(配列の要素は空っぽ)

型名[][]配列名 = new 型名[行数][];     //型名、名前、行数を指定する
配列名[0] = new 型名[行の長さ];        // 1行目の長さを指定
配列名[1] = new 型名[行の長さ];        // 2行目の長さを指定
…

まず、型名、名前、行数を指定したジャグ配列をメモリ上につくります。
次に、ジャグ配列の行ごとに配列を宣言して、行の長さを決めます。
行の番号を指定するには添え字を使います。
配列名[0]がジャグ配列の1行目で、配列名[0]がジャグ配列の2行目です。
これで、ジャグ配列の宣言ができます。

using static System.Console;
class Test { static void Main() { string[][] kago = new string[2][]; // 2行のジャグ配列の宣言 kago[0] = new string[1]; // 1行目に列の長さを1に指定 kago[1] = new string[2]; // 2行目の列の長さを2に指定 } }

1行目の配列の長さが1、2行目の配列の長さが2のstring型のジャグ配列kagoの宣言をしています。

ジャグ配列の要素に代入(初期化)と取得

ジャグ配列の要素に代入と取得は添え字を使って行います。

// ジャグ配列の要素に代入する
ジャグ配列名[行の番号][要素の番号] = 値;
// ジャグ配列の値を取得する ジャグ配列名[行の番号][要素の番号]

ジャグ配列に値を代入するには、[]の中に添え字を書いて指定します。
先頭の[]に書く添え字は、行の番号を意味し、次の[]に書く添え字は要素の番号を意味します。
ジャグ配列の値を取得する場合も、代入と同じです。

using static System.Console;
class Test { static void Main() { // ジャグ配列の宣言 string[][] kago = new string[2][]; // 2行のジャグ配列の宣言 kago[0] = new string[1]; // 1行目の行の長さを1 kago[1] = new string[2]; // 2行目の行の長さを2
// 要素の代入 kago[0][0] = "イチゴ"; // 1行目の1番目の要素に代入 kago[1][0] = "ミカン"; // 2行目の1番目の要素に代入 kago[1][1] = "モモ"; // 2行目の2番目の要素に代入
// 要素の取得 WriteLine(kago[0][0]); // 1行目の1番目の要素を表示 WriteLine(kago[1][0]); // 1行目の1番目の要素を表示 WriteLine(kago[1][1]); // 1行目の1番目の要素を表示 } }
イチゴ
ミカン
モモ

1行目の要素数が1、2行目の要素数が2のジャグ配列の宣言をしています。
要素に以下のものを代入して、表示しています。
– 1行目の1つ目の要素にはイチゴ
– 2行目の1つ目の要素にはミカン
– 2行目の2つ目の要素にはモモ

ジャグ配列の行ごとの配列の宣言と代入(初期化)を同時にする

ジャグ配列の行ごとの宣言と代入を同時にすることができます。

using static System.Console;
class Test { static void Main() { string[][] kago = new string[2][]; kago[0] = new string[1] { "イチゴ" }; // 1行目の長さを1にして、要素を代入 kago[1] = new string[2] { "ミカン", "モモ" }; // 2行目の長さを2にして、要素を代入 } }
1行目をイチゴで初期化
2行目をミカン、モモで初期化

ジャグ配列の配列ごとの宣言と代入を同時にするには、行ごとの配列の宣言のあとに{}で代入したい要素を書きます。
## ジャグ配列の宣言と初期化を同時に行う
ジャグ配列の宣言と初期化を同時に行うこともできます。

class Test
{
    static void Main()
    {
        string[][] kago = new string[][]
        {
            new string[] { "イチゴ" },                 // 1行目の初期化
            new string[] { "ミカン", "モモ" }     //2行目の初期化
        };
    }
}
1行目をイチゴで初期化
2行目をミカン、モモで初期化

ジャグ配列の宣言と初期化を同時にすることで、配列の行数の指定や、配列の行ごとの要素数の指定を省略できます。

ジャグ配列の要素をforで取得する

ジャグ配列の要素を全てforで取得できます。
forを使うと、要素を取得するときに全ての添字を書く必要がなくなります。

using static System.Console;
class Test { static void Main() { string[][] kago = new string[2][]; kago[0] = new string[1]; kago[1] = new string[2]; kago[0][0] = "イチゴ"; kago[1][0] = "ミカン"; kago[1][1] = "モモ";
for (int i = 0; i < kago.Length; i++) // 行の数だけループする { for (int j = 0; j < kago[i].Length; j++) // 行ごとの要素の数だけループする { WriteLine(kago[i][j]); // 全ての要素を表示する } } } }
イチゴ
ミカン
モモ

forを入れ子にすることで、外側のforでジャグ配列の行の数だけループ、内側で、行ごとの要素の数だけループすることができます。