为什么我们都有锯齿状数组和多维数组?

She*_*Pro 72 .net c# arrays visual-studio-2010

  1. 锯齿状数组和多维数组之间有什么区别.彼此之间有什么好处?

  2. 为什么Visual Studio不允许我这样做

    MyClass[][] abc = new MyClass[10][20];
    
    Run Code Online (Sandbox Code Playgroud)

    (我们曾经在C++中这样做,但在C#中它用红色蠕动线强调[20] ..说无效的等级说明符)

    但很高兴

    MyClass[,] abc = new MyClass[10,20];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后,我如何在一行中初始化它(就像我们在简单数组中一样{new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection;
    
    Run Code Online (Sandbox Code Playgroud)

the*_*oop 83

  1. 锯齿状数组是一个数组数组,因此a int[][]是一个数组int[],每个数组可以有不同的长度并占用内存中自己的块.多维数组(int[,])是单个内存块(本质上是一个矩阵).

  2. 您无法创建,MyClass[10][20]因为每个子数组都必须单独初始化,因为它们是单独的对象:

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    
    Run Code Online (Sandbox Code Playgroud)

    a MyClass[10,20]是可以的,因为它将单个对象初始化为具有10行和20列的矩阵

  3. A MyClass[][,][,]可以像这样初始化(虽然没有经过编译测试):

    MyClass[][,][,] abc = new MyClass[10][,][,];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20,30][,];
    
        for (int j=0; j<abc[i].GetLength(0); j++) {
            for (int k=0; k<abc[i].GetLength(1); k++) {
                abc[i][j,k] = new MyClass[40,50];
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

请记住,CLR针对单维数组访问进行了大量优化,因此使用锯齿状数组可能会比相同大小的多维数组更快.

  • @GreyCloud - http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c (6认同)
  • 你能指出一些证据表明单维数组访问速度更快吗? (5认同)
  • 示例:方格板 `var board = new Piece[8, 8];`、[变换矩阵](https://en.wikipedia.org/wiki/Transformation_matrix) `var m = new double[2, 2]; `。 (2认同)

Ant*_*ram 33

锯齿状数组是一个数组数组.不保证每个阵列的大小相同.你可以有

int[][] jaggedArray = new int[5][];
jaggedArray[0] = { 1, 2, 3 }; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.
Run Code Online (Sandbox Code Playgroud)

它是一相关的数组.

另一方面,多维数组更像是一个有凝聚力的分组,如盒子,桌子,立方体等,没有不规则的长度.也就是说

int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1
Run Code Online (Sandbox Code Playgroud)


Fre*_*els 9

矩形数组对于每一行始终具有相同的列数.

MyClass[,] x = new MyClass[10,30]
Run Code Online (Sandbox Code Playgroud)

每行有30列,而在锯齿状数组中,这不是必需的.因此,我认为你必须分别初始化锯齿状阵列中的每一个'行':

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[30];
}
Run Code Online (Sandbox Code Playgroud)

实际上,这意味着并非锯齿状数组中的每一行都必须包含相同数量的元素.(在我的例子中,它确实具有相同数量的元素,但这不是必需的).

你可以完美地做到这一点,例如:

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}
Run Code Online (Sandbox Code Playgroud)

可能是一篇有趣的文章.


nan*_*nan 5

广告 3)要初始化这样的怪物[][,][,],您可以执行以下操作:

        int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };
        int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };

        int [][,][,] superMultiArray = { multiArr1, multiArr2 };
Run Code Online (Sandbox Code Playgroud)