C# 为什么我们有交错数组和多维数组?
锯齿数组和多维数组的区别是什么。 一个对另一个有好处吗C# 为什么我们有交错数组和多维数组?,c#,.net,arrays,visual-studio-2010,C#,.net,Arrays,Visual Studio 2010,锯齿数组和多维数组的区别是什么。 一个对另一个有好处吗 为什么VisualStudio不允许我做一个 MyClass[][] abc = new MyClass[10][20]; < P>(我们以前在C++中这样做过,但是在C语言中,它用红色的RigggLY线表示[20)……无效秩说明符) 但是他很高兴 MyClass[,] abc = new MyClass[10,20]; 最后,我如何在一行中初始化它(就像我们在使用{new xxx…}{new xxx…}的简单数组中所做的那样) 锯
MyClass[][] abc = new MyClass[10][20];
< P>(我们以前在C++中这样做过,但是在C语言中,它用红色的RigggLY线表示[20)……无效秩说明符)
但是他很高兴
MyClass[,] abc = new MyClass[10,20];
{new xxx…}{new xxx…}
的简单数组中所做的那样)
锯齿数组是数组的数组。不能保证每个数组的大小相同。你本来可以的
int[][] jaggedArray = new int[5][];
jaggedArray[0] = new[] {1, 2, 3}; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.
这是一组相关的数组
另一方面,多维数组更像是一个内聚的分组,如长方体、表格、立方体等,其中没有不规则的长度。也就是说
int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1
int[][]
是int[]
的数组,每个数组可以具有不同的长度,并在内存中占据各自的块。多维数组(int[,]
)是单个内存块(本质上是一个矩阵)MyClass[10][20]
,因为每个子数组都必须单独初始化,因为它们是单独的对象:
MyClass[][] abc = new MyClass[10][];
for (int i=0; i<abc.Length; i++) {
abc[i] = new MyClass[20];
}
请记住,CLR针对一维数组访问进行了大量优化,因此使用交错数组可能比使用相同大小的多维数组更快。矩形数组的每行列数始终相同
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=新的MyClass[10][];
对于(int i=0;i<10;i++)
{
x[i]=新的MyClass[30];
}
事实上,这意味着交错数组中并非每一行都必须包含相同数量的元素。(在我的示例中,它确实具有相同数量的元素,但这不是必需的)
您完全可以做到这一点,例如:
MyClass[][] x = new MyClass[10][];
for(int i = 0; i < 10; i++)
{
x[i] = new MyClass[(30 + i)];
}
MyClass[]]x=新的MyClass[10][];
对于(int i=0;i<10;i++)
{
x[i]=新的MyClass[(30+i)];
}
对您来说可能是一篇有趣的文章。如果您要查找具有设置边界的多维数组,请始终使用
[,]
样式语法。这将确保每个部分的大小相等
当您使用[][]
时,真正要做的是创建一个数组数组。这意味着每个阵列的大小可以不同。例如:
int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
jaggedArray[index] = new int[index + 1];
}
int[]jaggedArray=新的int[5][]
对于(int index=0;index
内联声明如下所示:
int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
有关#1,请参见
对于交错或多维内联数组,请参见以下内容:
您不必指定尺寸(array3D),但如果您知道它们永远不会改变,那么了解您使用的尺寸(array3Da)会很有帮助。您需要了解阵列的内部工作原理 多维数组充当一维数组,但双重索引转换为单个索引 c#中的锯齿数组是一个对象数组,这些对象依次排列。Ad 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 };
我认为C++中的二维锯齿数组内存分配就像C++和C.中的2D数组。 因为2d交错数组有指向指针数组的指针,每个指针都指向元素数组(例如整数元素);像C++中的这个代码,
int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
2DArr[i] = new int[number2];
}
int**2DArr{newint*[number1]};
对于(int i=0;i
下面代码的内存分配与C#中的2d锯齿数组相同。但我对此表示怀疑,如果我的想法不正确,你能解释一下吗。这篇文章很老了,但下面是我的想法 交错数组是多维数组。多维数组有两种:矩形数组和锯齿数组。矩形数组表示一个n维内存块,锯齿状数组是数组的数组 矩形阵列 矩形数组使用逗号来分隔每个维度。下面的语句声明了一个矩形二维数组,其中的维数为3×3:
int[,] matrix = new int [3, 3];
锯齿状阵列
交错数组使用连续的方括号来表示每个维度。下面是一个声明交错二维数组的示例,其中最外层的维度是3:
int[][] matrix = new int[3][];
对于多维数组,请考虑长方体或矩形。每行长度相同,每列长度相同 在锯齿状数组中,行和列的大小可能不同。例如,列或行的大小可能不同。这将导致形状可能不是沿边向下的一条直线,就像矩形一样。相反,两边可能参差不齐
现在我在这个例子中使用了2维/2数组,但这适用于更多的情况。锯齿数组的全部要点是“嵌套”数组不必具有统一的大小。-多维数组语法[X,Y]根据docsAdditional子问题是有效的:是否可以将foreach()用于多维数组?@Serge-当然,因为
array
实现了IEnumerable
。您可以随时尝试并亲自查看:)可能的重复项您能为我们指出一些证据,证明一维数组访问更快吗?@GreyCloud-多维数组是否有(通用)用例?示例:棋盘格var board=新棋子[8,8]代码>,avar m=新的双精度[2,2]代码>。我尝试了你的代码。它没有编译。尝试添加int[3],因此尝试jaggedArray[0]=int[3]{1,2,3}
;我知道我
int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
2DArr[i] = new int[number2];
}
int[,] matrix = new int [3, 3];
int[][] matrix = new int[3][];