[英]How to initialize a multidimensional array
我的問題是我想初始化一個聲明如下的多維數組:
int[][][] my3DArray;
但是,以下代碼在[sizeY][sizeZ]
上給我一個錯誤,說它應該是“,”或“]”。
void Set3DArraySize(int sizeX, int sizeY, int sizeZ)
{
my3DArray = new int[sizeX][sizeY][sizeZ];
}
當我像這樣聲明數組時:
int[,,] my3DArray;
通過這樣做,我可以毫無問題地初始化它:
my3DArray = new int[sizeX,sizeY,sizeZ];
但是問題就變成了,如果我嘗試獲取其中一個數組的長度,例如my3DArray[x,y].Length
並且我不得不將所有索引一起my3DArray[x,y,z]
。
那么,有什么方法可以初始化數組並將其聲明為int[][][] my3DArray;
? 或者我是否必須將數組的大小存儲在其他地方並像這樣使用它int[,,] my3DArray;
?
你可以做:
new int[][][] myArray = new int[][][]
{
new int[][]
{
new int[]
{
// Your numbers
}
}
}
myArray[0].Length
myArray[0][0].Length
myArray[0][0][0].Length
工作正常
int[][] 是一個 jaggad 數組,這意味着每個數組可以有不同的大小。 這就是為什么你可以這樣初始化它:
int[][] arr2D= new int[3][];
arr2D[0] = new int[0];
arr2D[1] = new int[1];
arr2D[2] = new int[2];
這將創建一個如下所示的二維數組:
_
_ _
_ _ _
以下是創建 3d jaggad 數組的示例(每個維度的大小不同 - 5 行、3 列和 6 深度):
int[][][] arr3D = new int[5][][];
for (int col = 0; col < arr3D.Length; col++)
{
arr3D[col] = new int[3][];
for (int depth = 0; depth < arr3D[col].Length; depth++)
{
arr3D[col][depth] = new int[6];
}
}
為了獲得 jaggad 數組中的維度大小,您可以簡單地獲取數組的長度,但請記住,如果數組實際上是鋸齒狀的,則不同數組的大小將不同。 如果您使用相同的值初始化特定維度中的所有數組,那么您可以檢查它們中的任何一個,它將是相同的。
int[,] 是一個多維數組,每個維度都有固定的大小。 創建多維: int[,] arr2D = new int[3,4];
這將創建一個如下所示的二維數組:
_ _ _ _
_ _ _ _
_ _ _ _
在多維數組中,您不能更改特定行或列的長度。
在大多數情況下,您可能更喜歡多維數組。
為了獲取多維數組中特定維度的大小,可以使用以下方法: int rows = arr22.GetLength(0); int cols = arr22.GetLength(1); int depth = arr22.GetLength(2);
int rows = arr22.GetLength(0); int cols = arr22.GetLength(1); int depth = arr22.GetLength(2);
輸入是您想要的尺寸。
你不能像這樣在一行中聲明一個鋸齒狀數組: new int[sizeX][sizeY][sizeZ];
因為你真的有三層嵌套數組。 您需要在每個級別初始化它們。
這就是它的樣子:
void Set3DArraySize(int sizeX, int sizeY, int sizeZ)
{
my3DArray = new int[sizeX][][];
for (var x = 0; x < sizeX; x++)
{
my3DArray[x] = new int[sizeY][];
for (var y = 0; y < sizeY; y++)
{
my3DArray[x][y] = new int[sizeZ];
}
}
}
現在,如果你確實想初始化一個多維數組,你可以這樣做:
int[,,] z =
{
{ { 1, 2, }, { 1, 2, }, { 1, 2, }, },
{ { 1, 5, }, { 1, 5, }, { 2, 8, }, },
{ { 1, 5, }, { 1, 5, }, { 2, 8, }, },
{ { 1, 5, }, { 1, 5, }, { 2, 8, }, },
};
然后,要獲得尺寸,您可以這樣做:
Console.WriteLine(z.GetLength(0));
Console.WriteLine(z.GetLength(1));
Console.WriteLine(z.GetLength(2));
這給了我:
4
3
2
需要注意的是,對於鋸齒狀數組,每個嵌套數組的長度都可以不同,但對於多維數組,每個維度都必須是統一的。
例如,鋸齒狀數組可能如下所示:
int[][] y = new int[][]
{
new [] { 1, 2, },
new [] { 1, 2, 3, },
new [] { 1, },
};
還有一個像這樣的多維數組:
int[,] y =
{
{ 1, 2, 3, },
{ 4, 5, 3, },
{ 1, 6, 3, },
{ 1, 7, 8, },
};
我不能這樣做:
//illegal!!!
int[,] y =
{
{ 1, 2, 3, },
{ 4, 5, 3, 7, },
{ 1, 6, },
{ 1, 7, 8, },
};
第一的,
int[][][]
是一個鋸齒狀數組,或一個數組數組的數組。 然而,
int [,,]
是一個多維數組。 具有多個維度的單個數組。
雖然多維數組更容易實例化並且在每個軸上都有固定的維度,但從歷史上看,CLR已經針對更常見的單維數組情況進行了優化,如在鋸齒狀數組中使用的那樣。 對於大尺寸,您可能會遇到意外的性能問題。
您仍然可以使用GetLength方法獲取多維數組的維度,並指定您感興趣的維度,但是有點笨拙。
可以從Rank屬性中檢索維度的數量。
您可能更喜歡鋸齒狀數組並一次實例化一個軸。
要實例化鋸齒狀數組,請參閱初始化鋸齒狀數組。
void Set3DArraySize(int sizeX, int sizeY, int sizeZ)
{
my3DArray = Enumerable.Repeat(Enumerable.Repeat(new int[sizeZ], sizeY).ToArray(),sizeX).ToArray();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.