読者です 読者をやめる 読者になる 読者になる

C#_(三?)多次元配列 の初期化

C# プログラム

二次元配列 ( 三次元配列 ) と 配列の中の配列 ( の中の配列 ) は違うものらしい。
二次元配列 ( 三次元配列 ) は1つの foreach で要素全て取り出せるとのこと。

下記から。
http://mag.autumn.org/Content.modf?id=20040810213604

 

配列に悩まされるのでメモ3。めっちゃ分からなくなる。

配列の中に、二次元配列を格納 する。

■ 宣言と長さ確保

二次元配列の長さのみを指定
[ ][ , ] 変数 = new 型[ ][ , ] { new int [  ,  ) ]  };

 

配列の長さと、二次元配列の長さを指定。
[ ][ , ] 変数 = new[ 配列の長さ ][ , ]
{
    //配列の長さ分、二次元配列を長さ(, )指定してnew
    new int [  ],
    new int [ ],
    :
    :
};

 

■ 初期化

[,] 変数 = new[配列の長さ][,]
{
    //配列の長さ分、二次元配列を初期化
    ex)3 * 4 の int 型二次元配列
    new [,]{ {  1,  2,  3,  4 }, { 5,  6,  7,  8  }, {  9, 10, 11, 12 } },
    new [,]{ { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } },
    :
};

 

ex)

 int[ ][,]a二次元配列宣言長さ確保

 int[ ][,]b配列二次元配列宣言長さ確保

 int[ ][,]c初期化

c は↓のようなイメージ
[0][ 1,  2,  3,  4],
    [ 5,  6,  7,  8],
    [ 9, 10, 11, 12]

[1][13, 14, 15, 16],
    [17, 18, 19, 20],
    [21, 22, 23, 24]

[2][25, 26, 27, 28],
    [29, 30, 31, 32],
    [33, 34, 35, 36]

[3][37, 38, 39, 40],
    [41, 42, 43, 44],
    [45, 46, 47, 48]

[4][49, 50, 51, 52],
    [53, 54, 55, 56],
    [57, 58, 59, 60]

 

//b c3 × 4 の二次元配列を 5 持つ配列
int[,] a = new int[,] { new int[3, 4] };

int[,] b = new int[5][,] {
    new int[3, 4],
    new int[3, 4],
    new int[3, 4],
    new int[3, 4],
    new int[3, 4]
};
int[][,] c = new int[5][,]
{
    new [,]{ {  1,  2,  3,  4 }, { 5,  6,  7,  8  }, {  9, 10, 11, 12 } },
    new [,]{ { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } },
    new [,]{ { 25, 26, 27, 28 }, { 29, 30, 31, 32 }, { 33, 34, 35, 36 } },
    new [,]{ { 37, 38, 39, 40 }, { 41, 42, 43, 44 }, { 45, 46, 47, 48 } },
    new [,]{ { 49, 50, 51, 52 }, { 53, 54, 55, 56 }, { 57, 58, 59, 60 } }
};


//c 配列の列挙
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 3; j++)
    {
        for (int k = 0; k < 4; k++)
        {
            //1 ~ 60 が出力
            //Console.WriteLine(c[i][j, k]);
        }
    }
}
/* 出力は以下も可
foreach (var cc in c)
{
    foreach (var ccc in cc)
    {
        Console.WriteLine(ccc);
    }
}
*/

  宣言時の要素の数(サイズ) と 代入・列挙の時の index異なる
ex) c 変数の 60 を取得したい時は、 c[4][2,3] とする。

 

■注意■

配列長さまたは、配列の初期化子指定する必要がある。
初期化子: { 初期値, 初期値, … } の部分

以下は NG
int[ ][,] hoga = new int[ ][,] { new int[,] };   //長さ、初期化子を指定していない

int[ ][,] fuga = new int[5][,] { new int[3, 4] };
 //長さが 5と決まったのでその分の初期化子が必要。

 

以上。