为什么我们有锯齿arrays和多维arrays?
-
锯齿arrays和多维arrays有什么区别。 彼此有利益吗?
-
为什么Visual Studio不允许我做一个
MyClass[][] abc = new MyClass[10][20];
(我们曾经在C ++中这样做过,但是在C#中,它用红色的wriggly线来强调[20] ..说无效的等级说明符)
但很高兴
MyClass[,] abc = new MyClass[10,20];
-
最后,我怎样才能在一行中初始化它(就像我们用
{new xxx...}{new xxx....}
MyClass[][,][,] itemscollection;
-
一个锯齿状的数组是一个数组的数组,所以一个
int[][]
是一个int[]
数组,每个数组的长度可以不同,并占用自己的内存块。 multidimensional array(int[,]
)是一个单独的内存块(本质上是一个matrix)。 -
你不能创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 -
一个
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数组。