为什么我们有锯齿arrays和多维arrays?

  1. 锯齿arrays和多维arrays有什么区别。 彼此有利益吗?

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

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

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

    但很高兴

     MyClass[,] abc = new MyClass[10,20]; 
  3. 最后,我怎样才能在一行中初始化它(就像我们用{new xxx...}{new xxx....}

     MyClass[][,][,] itemscollection; 
  1. 一个锯齿状的数组是一个数组的数组,所以一个int[][]是一个int[]数组,每个数组的长度可以不同,并占用自己的内存块。 multidimensional array( int[,] )是一个单独的内存块(本质上是一个matrix)。

  2. 你不能创build一个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列的matrix

  3. 一个MyClass[][,][,]可以像这样初始化(但不是编译testing):

     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]; } } } 

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

锯齿形数组是数组的数组。 不保证每个数组的大小相同。 你可以有

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

这是一相关的数组。

另一方面,multidimensional array更像是一个有凝聚力的组合,如箱子,桌子,立方体等,其中没有不规则的长度。 也就是说

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

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

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

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

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

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

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

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

这可能是一个有趣的文章给你。

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

如果您正在寻找一个设置了边界的multidimensional array,请始终使用[,]样式语法。 这将确保每个部分的大小相同。

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

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

内联声明看起来像这样:

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

对于#1,看到这个问题

对于锯齿或多维的内联arrays,请参阅此编程指南 :

 // 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)是有帮助的。

您需要了解数组的内部工作,multidimensional array作为单维数组,除了将双重索引转换为单个数组。

你在C#中的Jagged数组是一个对象数组,它是轮stream数组。