2009-07-21 207 views
9

从perl背景来看,我总是使用int[][]定义了一个2D数组。我知道你可以用int[,]代替,所以有什么区别?使用int [] []和int [,]有什么区别?

+1

这里是在性能方面的一些想法:http://stackoverflow.com/问题/ 168897/whats-better-in-regards-to-performance-type-type-type – 2009-07-21 13:39:47

回答

29

这里的区别在于第一个示例int [] []创建了jagged array,而第二个示例创建了rectangular array(第二维)。在锯齿状数组中,每个“列”可以具有不同的大小。在真正的多维数组中,每个“列”(在维度中)的大小相同。有关更完整的信息,请参阅C# Programming GuideArray section

9

int [] []是一个数组或“锯齿状”数组的数组:当您需要第二维中的不同大小时,可以使用此数组。例如,第一个子阵列可以有5个元素,第二个子阵列可以有42个。

int [,]是一个二维数组:第二维在整个数组中是相同的。使用int [7,42],第二维对于所有7行都是42。

+1

把话说出来。 – MyItchyChin 2009-07-21 13:39:52

12

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] 

每个人都有这取决于你想完成什么及其用途。

+1

锯齿 - 每个“行”可以有不同的'列'长度。多维 - 每个“行”具有相同的“列”长度。 – Will 2009-07-21 13:54:10

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

3

int [] []被称为数组阵列,它可以有每行的任意长度。

int [,]被称为矩形阵列,其中所有行具有相同的长度。它可以被第一个模拟。

0

有关交错数组需要考虑的一件事是您正在分配非连续的内存块。如果你有大量的大对象,这是一件好事。我见过SomeThing [n,n]创建StackOverflow问题,但SomeThing [n] [n]没问题。

此外,如果一个对象获取> 85,000字节,它会转到LOH(大对象堆)。 .NET Collections and the Large Object Heap (LOH)

0

Here是关于数组的优秀文章,涵盖了这个话题。

1

理解上的差异,最好的办法是看两个方面来创建一个n×n的矩阵:

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循环到完全创建它。它通常被称为锯齿状数组,因为二阶数组不需要全部具有相同的长度。

0

你可以看到INT [] []为(INT [])[] (INT [])是一个对象

相关问题