簡體   English   中英

確定在C#中的數組的大小?

[英]Determining size of an array of arrays in C#?

我正在創建這樣的數組數組:

var arrNewArray = new string[arrOldArray.Length][7];

arrOldArray是一個數組數組,其值為[X] [4],這意味着第一個數組或“外部”數組的長度可以更改,但是“內部”數組的長度始終為4,或保留4個字符串([ 0] [1] [2] [3])。

編譯器為什么不接受我的上述聲明?

本質上,我試圖采用arrOldArray並將其擴展,或者通過將舊數組中的[4]增加到新數組中的[7],然后添加更多“列”,然后將內容復制過來。 也許我沒有以最佳/有效的方式來做,所以任何指導都將不勝感激。

我想你想要一個二維數組:

var arrNewArray = new string[arrOldArray.Length, 7];

您可以這樣訪問它: arrNewArray[x, y]

這比鋸齒數組更好,因為它清楚地表明每行的“列”數是相同的。

如果要繼續使用鋸齒狀數組,則需要這樣做:

var arrNewArray = new string[arrOldArray.Length][];
for(int i = 0; i < arrOldArray.Length; ++i)
    arrNewArray[i] = new string[7];

這種令人費解的方式的原因是:對於鋸齒狀數組,每個“行”可以具有不同數量的“列”。 對於每個“行”具有相同數量的“列”的情況,不存在簡寫語法。 這就是為什么您的代碼無法編譯的原因。
鋸齒狀的數組對於數組的數組至關重要,因此您需要為外部數組的每個“行”創建一個新的數組實例,並對其進行顯式分配。 這就是for循環正在做的事情。

您不能將Array.Copy與鋸齒狀數組一起使用。 每個子數組都是它自己的實例,而Array.Copy並不進行深拷貝,它只是將引用從一個數組復制到另一個數組。 效果是,兩個數組都指向相同的項目,而從另一個數組中看到一個項目中的更改項目。

您沒有正確創建鋸齒狀數組。 正確的方法是創建鋸齒狀數組的第一維,然后循環遍歷第一維的各項以創建嵌套數組並從舊數組中復制數據。 這是一個例子:

int newSize = 7;
string[][] newArray = new string[oldArray.Length][];
for (int i = 0; i < oldArray.Length; i++)
{
    newArray[i] = new string[newSize];
    Array.Copy(oldArray[i], newArray[i], oldArray[i].Length);
}

你會想要

var arrNewArray = new string[arrOldArray.Length, 7];
var arrNewArray = new[] {new string[7]};//array of arrays
var arrNewArray = new string[arrOldArray.Length, 7];//two-dimensional array

使用Linq:

int[][] jaggedArray2 = new int[][] 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};
int length = jaggedArray.Sum(a => a.Length);

我不認為您的要求是直接可能的。 因為您使用的語法是針對鋸齒狀數組的,所以您實際上在要求它創建多維數組。

語法令人困惑,因為它看起來像您真正想要的是多維數組(盡管我知道不是這種情況。)

我不相信由於大小的變化,您也不能將數組存儲在新分配的數組中。 您將需要構建一個自定義復制方法,以將數據移入更大的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM