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

时间:2011-01-10 16:20:57

标签: c# .net arrays visual-studio-2010

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

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

    MyClass[][] abc = new MyClass[10][20];
    

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

    但很满意

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

    MyClass[][,][,] itemscollection;
    

11 个答案:

答案 0 :(得分:70)

  1. 锯齿状数组是一个数组数组,因此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];
    }
    

    MyClass[10,20]没问题,因为它正在将一个对象初始化为一个包含10行和20列的矩阵

  3. 可以像这样初始化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];
            }
        }
    }
    
  4. 请记住,CLR针对单维数组访问进行了大量优化,因此使用锯齿状数组可能会比同样大小的多维数组更快。

答案 1 :(得分:30)

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

int[][] jaggedArray = new int[5][];
jaggedArray[0] = { 1, 2, 3 }; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.

这是相关数组的 set

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

int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1

答案 2 :(得分:7)

矩形数组的每一行总是具有相同的列数。

MyClass[,] x = new MyClass[10,30]

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

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

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[30];
}

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

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

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

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}

This可能是一篇有趣的文章。

答案 3 :(得分:4)

广告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 };

答案 4 :(得分:1)

如果您正在寻找具有设置边界的多维数组,请始终使用[,]样式语法。这将确保每个部分的大小相同。

当你使用[][]时,实际上你正在创建一个数组数组。这意味着每个阵列的大小可以不同。例如:

int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
    jaggedArray[index] = new int[index + 1];
}

答案 5 :(得分:1)

内联声明看起来像这样:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };

答案 6 :(得分:1)

对于#1,请参阅this SO question

对于锯齿状或多维内联数组,请参阅此programming guide

// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
// Same array with dimensions specified.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };

您不必指定尺寸(array3D),但如果您知道它们永远不会改变,那么了解您正在使用的尺寸(array3Da)会很有帮助。

答案 7 :(得分:0)

您需要了解阵列的内部工作原理 除了将双索引转换为单个索引之外,多维数组充当单维数组。

c#中的Jagged数组是一个对象数组,它们是数组。

答案 8 :(得分:0)

我认为C#中的2d锯齿状数组内存分配就像C ++和C中的2d数组一样。 因为2d锯齿状数组具有指向指针数组的指针,每个指针都指向一个元素数组(例如整数元素);就像C ++中的这段代码一样,

int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
   2DArr[i] = new int[number2];
}

代码的内存分配与C#中的2d锯齿状数组相同。但我怀疑,如果我以错误的方式思考,请你解释一下。

答案 9 :(得分:0)

这篇文章很旧,但是我对此有何看法。

锯齿状数组是多维数组。多维数组有两种:矩形和锯齿状。矩形数组代表内存的n维块,锯齿状数组是数组的数组。

矩形数组

使用逗号分隔矩形数组,以分隔每个维。以下语句声明一个矩形二维数组,其尺寸为3×3:

@text = Text.new("Score: #{@score}")
update do
    ...
    @text.remove # At a time you want to stop displaying that text.
    ...
end

锯齿状的阵列

锯齿状数组使用连续的方括号声明,以表示每个维。这是声明一个锯齿状二维数组的示例,其中最外面的维是3:

int[,] matrix = new int [3, 3]; 

答案 10 :(得分:0)

对于多维数组,请考虑一个方框或矩形。每行长度相同,每列长度相同。

在锯齿状数组中,行和列的大小可能不同。例如,列或行可以具有不同的大小。这将导致形状可能不是矩形下方的直线。取而代之的是,侧面可能是<锯齿状。

现在,在此示例中,我使用了2维/ 2个数组,但这适用于更多数组。