多維陣列的Resize

在不規則的多維陣列中,每個陣列其實是各自獨立。所以Resize也是會各自的分開各自處理。比如說下面的一個例子:
int[][] myJaggedArray =
{
new int[] { 2, 3, 4 },
new int[] { 13, 23 }
};
如果說myJaggedArray[0]的Length由3要改為4, myJaggedArray[1]的Length由2改為1。
Array.Resize(ref myJaggedArray[0], 4);
Array.Resize(ref myJaggedArray[1], 1);
結果會變成
myJaggedArray[0]變成{ 2, 3, 4, 0 }
myJaggedArray[1]變成{ 13 }

但是規則的多維陣列中,整個陣列可以說是一體的。
因為這種的陣列,並無法用Array.Resize這個方法來進行。所以很多網路上的作法是利用Array.Copy進行。比如像下方的程式段:
int[,] myArray = new int[2, 3]
{
{ 2, 3, 4 },
{ 13, 23, 33 }
};
myResize1(ref myArray, 3, 4);

private void myResize1(ref int[,] changeArray, int rank0, int rank1)
{
int s_rank0 = changeArray.GetLength(0);
int s_rank1 = changeArray.GetLength(1);
int[,] array2 = new int[rank0, rank1];
Array.Copy(changeArray, array2, s_rank0 * s_rank1);
changeArray = array2;
}

最後的結果會變成
myArray[3, 4]=
{
{ 2, 3, 4, 13 },
{ 23, 33, 0, 0 },
{ 0, 0, 0, 0 }
};

這表示多維陣列是整個整體串聯,改變size這樣的方式未必是你想要的結果。
比如說,你要的結果是希望原本
myArray[2,3] ====> myArray[3,4]
2 3 4 ====> 2 3 4 0
13 23 33 ====> 13 23 33 0
====> 0 0 0 0

就是說你的resize是希望如下圖的模式:


那利用Array.Copy來進行多維陣列resize就會有些頭痛。當然硬是用兩個forloop來硬寫也是可以。有沒有甚麼更方便的方法,目前還在思考中。

Note: 之所以會想用多維陣列來做這個部分,是因為在撰寫直接write Excel檔案的時候,
Range.Value2=myData;
這邊的myData要用多維陣列,而不是不規則的多維陣列。

留言

這個網誌中的熱門文章

C# 不規則陣列不定長度設定方法

C#利用DateTime估計程式執行時間