使用 int[][] 和 int[,] 有啥区别? [复制]
Posted
技术标签:
【中文标题】使用 int[][] 和 int[,] 有啥区别? [复制]【英文标题】:What are the differences between using int[][] and int[,]? [duplicate]使用 int[][] 和 int[,] 有什么区别? [复制] 【发布时间】:2010-11-12 15:40:40 【问题描述】:来自 perl 背景,我一直使用int[][]
定义一个二维数组。我知道你可以改用int[,]
,那么有什么区别?
【问题讨论】:
以下是一些关于性能的想法:***.com/questions/168897/… 【参考方案1】:这里的区别在于,第一个样本 int[][] 创建了一个 jagged array,而第二个样本创建了一个 rectangular array(维度为 2)。在锯齿状数组中,每个“列”可以具有不同的大小。在真正的多维数组中,每个“列”(在一个维度中)的大小相同。如需更完整的信息,请参阅C# Programming Guide 的Array section。
【讨论】:
【参考方案2】:Here's a good comparison
基本上 int[][] 是一个“锯齿状”数组,它看起来像这样:
[] -> [1, 2, 3]
[] -> [1, 2]
[] -> [1, 2, 3, 4]
而 int[,] 是一个多维数组,它总是具有相同的宽度和高度:
[1, 2, 3, 4
5, 6, 7, 8
9, 1, 2, 3]
每个都有其用途,具体取决于您要完成的工作。
【讨论】:
锯齿状——每个“行”可以有不同的“列”长度。多维——每个“行”具有相同的“列”长度。【参考方案3】:int[][] 是一个数组数组或“锯齿状”数组:当您想要第二维中的不同大小时可以使用它。例如,第一个子数组可以有 5 个元素,第二个可以有 42 个。
int[,] 是一个二维数组:第二维在整个数组中都是相同的。对于 int[7, 42],所有 7 行的第二维都是 42。
【讨论】:
从我嘴里说出来的话。【参考方案4】:int[][] 是一个交错数组,其中 int[,] 是一个二维数组。
很明显
var a = int[][]
允许你有一个这样的数组:
a[0] = new int[2];
a[1] = new int[5];
与 int[,] 一样,您必须始终使数组的第二部分相同:
var a = int[2,2];
a[0,0]
a[0,1]
a[1,0]
a[1,1]
你不能有 [2,2];
【讨论】:
【参考方案5】:int[][] 称为数组数组,每行可以有任意长度。
int[,] 称为矩形数组,其中所有行的长度相同。可以用第一个来模拟。
【讨论】:
【参考方案6】:了解差异的最佳方法是查看创建 nxn 矩阵的两种方法:
const int n = 8, m = 8;
int[,] matrix1 = new int[n,m];
int[][] matrix2 = new int[n][];
for (int i = 0; i < matrix2.Length; i++) matrix2[i] = new int[m];
matrix1[1,1] = matrix2[2][2];
正如您所见,第二个涉及更多,因为您需要 for 循环来完全创建它。它通常被称为锯齿状数组,因为二阶数组的长度不需要全部相同。
【讨论】:
【参考方案7】:关于锯齿状数组需要考虑的一点是,您正在分配不连续的内存块。如果您有大量大型对象,这是一件好事。我见过 SomeThing[n,n] 创建 *** 问题,但 SomeThing[n][n] 没问题。
此外,如果一个对象获得 > 85,000 字节,它会进入 LOH(大对象堆)。 .NET Collections and the Large Object Heap (LOH)
【讨论】:
【参考方案8】:Here 是一篇关于数组的优秀文章,很好地涵盖了这个主题。
【讨论】:
【参考方案9】:你可以看到 int[][] 与 (int[])[] (int[]) 是一个对象
【讨论】:
以上是关于使用 int[][] 和 int[,] 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
INT(10) 和 INT(12) 之间有啥区别(应用于我的代码时)?