Unity++blog.

UnityやC#とかについて学習したことを書いてます

C# 複数の二次元配列同士を連結・結合させる

二次元配列を2つまで連結させる記事はあったのですが、複数を連結させる記事がなかったので自分のやったやり方を書いておきます。(応用しただけですが)

 

string[ , ]  a

string[ , ]  b

string[ , ]  c

string[ , ]  d

 

このように複数の二次元配列を

x=a+b+c+d こうするイメージです。ちなみにx[0,0]はa[0,0]となります。

 

使用する関数はArray.Copy関数です。docs.microsoft.com

 

引数のざっくり説明↓

Array.Copy(①コピーされる変数,②どこからコピーするかインデックス(すべてコピーするなら0),③受け取る変数, ④格納を開始するインデックス(受け取る変数の),⑤コピーされる要素の数)

 

例えばすでに値は入っているとして、a[,]とb[,]を結合させてみます。

 

こういった形になるのですが、ひとつひとつ見ていきます。

①int countX = a.GetLength(0)+b.GetLength(0)

②var merged = new string[ countX , 5];

③Array.Copy(a , 0 , merged , 0 ,  a.Length);

 ④Array.Copy(b , 0 , merged , a.Length ,  b.Length)

 

①基本的には同系統のものを結合させると想定してa[x,y]のy部分(列数)は同じものだとして、x部分(行部分)は動的に値を取得します。GetLength(0)メソッドでx部分を取得します。ちなみにa[x,y]のy部分はGetLength(1)で取得することができます。

 

int countX = a.GetLength(0)+b.GetLength(0)

 

②結合したものを入れる変数を宣言、初期化しますy部分(列数)は適当に5としました。

 

var merged = new string[ countX , 5];

 

③このmergedにまずはaをコピーします。引数はこんな感じでした↓

//Array.Copy(①コピーされる変数,②どこからコピーするかインデックス(すべてコピー  するなら0),③受け取る変数, ④格納を開始するインデックス(受け取る変数の),⑤コピーされる要素の数)

 

Array.Copy(①a ,② 0 , ③merged , ④0 ,  ⑤a.Length);

 

これでmergedへaがコピーされました。

さらにbをmergedへコピーします。

 

Array.Copy(b , 0 , merged , a.Length ,  b.Length)

 

④の格納開始場所は最初は0でしたが、今はすでにaが入っていますので、a.Lengthの要素数を指定して、その後にbのコピーを開始します。

 

 

さらに多くの配列をコピーする場合も基本的には同じで、④番をすこし気をつければ大丈夫です。

 

例えばさらに  string c[,]をmergedに加えたい場合は

 

Array.Copy(c , 0 , merged , a.Length+b.Length ,  c.Length) とします。

 

格納をスタートする場所を「a.Length+b.Length」 として現在持っている情報の後ろにインデックス番号を指定するようにしなければおかしなことになってしまいます。

 

現在英語アプリを作成していて、二次元配列をくっつける必要が出てきたのでその時調べて使用しました↓ 変数にはすでにstring[,]で値を入れています。不必要なものは消しています。

 

 

 さらに沢山の二次元配列を加える場合などがあれば手を加える必要があろうかと思いますが、数個程度ならこれで乗り切ればいいのではないでしょうか。

 

あと見栄えもあまり良くないですが、ネットで調べる限りでは二次元配列同士の結合のやり方を見つけるのが難しかったので我慢です。

 

あと上の例のデバグ用です↓( ´∀` )

int Count = 0;
for (int i = 0; i < merged.GetLength(0); i++)
{
  MessageBox.Show(merged[Count, 1]+"/"+ merged[Count, 2]+ "/" + merged[Count,   3]+ "/" + merged[Count, 4]);


  Count++;

}