使用 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 和 NSInteger 有啥区别? [复制]

int 和 integer 有啥区别

INT(10) 和 INT(12) 之间有啥区别(应用于我的代码时)?

int[ ] 和 Integer [ ] 有啥区别 [重复]

int++ 和 ++int 有啥区别? [复制]

intXX_t 和 int_fastXX_t 有啥区别?