2009-07-21 4 views
9

Исходя из фона perl, я всегда определял 2D-массив, используя int[][]. Я знаю, что вы можете использовать int[,], а в чем же разница?В чем разница между использованием int [] [] и int [,]?

+1

Вот некоторые мысли с точки зрения производительности: http://stackoverflow.com/ Вопросы/168897/whats-better-in-regards-to-performance-type-or-type –

ответ

29

Разница заключается в том, что первый образец, int [] [] создает jagged array, а второй создает rectangular array (размерности 2). В зазубренном массиве каждый «столбец» может иметь разный размер. В истинном многомерном массиве каждый «столбец» (в измерении) имеет одинаковый размер. Для получения более полной информации см. Array section из C# Programming Guide.

9

int [] [] - массив массивов или массив с «зубчатыми» элементами: вы можете использовать это, когда хотите выбрать разные размеры во втором измерении. Например, первый вспомогательный массив может иметь 5 элементов, а второй может иметь 42.

int [,] - двумерный массив: второе измерение одинаково по всему массиву. При int [7, 42] второе измерение составляет 42 для всех 7 линий.

+1

Взял слова прямо изо рта. – MyItchyChin

12

Here's a good comparison

В основном ИНТ [] [] является "неровным" массивом, это выглядит следующим образом:

[] -> [1, 2, 3] 
[] -> [1, 2] 
[] -> [1, 2, 3, 4] 

В то время как INT [,] является многомерным массивом, который всегда имеет ту же ширину и высота:

[1, 2, 3, 4 
5, 6, 7, 8 
9, 1, 2, 3] 

Каждый из них имеет свои применения в зависимости от того, что вы пытаетесь выполнить.

+1

Jagged - каждая строка может иметь разные длины столбцов. Многомерный - каждая строка имеет ту же длину столбца. – Will

4

int [] [] - это зубчатый массив, где int [,] - двумерный массив.

явно

var a = int[][] 

позволяет есть массив как это:

a[0] = new int[2]; 
a[1] = new int[5]; 

где, как с межд [,] вы должны всегда иметь вторую часть массива быть одинаковыми:

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 (Large Object Heap). .NET Collections and the Large Object Heap (LOH)

0

Here отличная статья о массивах, охватывающая эту тему очень хорошо.

1

Лучший способ понять разницу, чтобы посмотреть на двух способов создать матрицу 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]; 

Как вы можете видеть, что второй один немного сложнее, потому что вам нужно для-петли для полностью создать его. Его часто называют зубчатым массивом, потому что массивы 2-го порядка не обязательно должны иметь одинаковую длину.

0

вы можете увидеть ИНТ [] [], чтобы (ИНТ []) [] (ИНТ []) является объектом

Смежные вопросы