簡體   English   中英

如何初始化多維數組

[英]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.

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