Почему у нас есть как зубчатый массив, так и многомерный массив? - PullRequest
64 голосов
/ 10 января 2011
  1. В чем разница между зубчатым массивом и многомерным массивом.Есть ли преимущество одного на другом?

  2. И почему Visual Studio не позволяет мне делать

    MyClass[][] abc = new MyClass[10][20];
    

    (Мы привыкли делать это в C ++, но в C # он подчеркивает [20] красной извилистой линией .. говорит неверный спецификатор ранга)

    , но доволен

    MyClass[,] abc = new MyClass[10,20];
    
  3. Наконец, как я могу инициализироватьэто в одной строке (как мы делаем в простом массиве с {new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection;
    

Ответы [ 9 ]

75 голосов
/ 10 января 2011
  1. Зубчатый массив - это массив массивов, поэтому int[][] - это массив int[], каждый из которых может иметь различную длину и занимать свой собственный блок в памяти. Многомерный массив (int[,]) - это один блок памяти (по сути, матрица).

  2. Вы не можете создать MyClass[10][20], потому что каждый вложенный массив нужно инициализировать отдельно, так как они являются отдельными объектами:

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    

    a MyClass[10,20] нормально, потому что он инициализирует один объект как матрицу с 10 строками и 20 столбцами

  3. A MyClass[][,][,] может быть инициализирован следующим образом (хотя не проверяется на компиляцию):

    MyClass[][,][,] abc = new MyClass[10][,][,];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20,30][,];
    
        for (int j=0; j<abc[i].GetLength(0); j++) {
            for (int k=0; k<abc[i].GetLength(1); k++) {
                abc[i][j,k] = new MyClass[40,50];
            }
        }
    }
    

Имейте в виду, что CLR сильно оптимизирован для доступа к одномерному массиву, поэтому использование зубчатого массива, вероятно, будет быстрее, чем многомерный массив того же размера.

31 голосов
/ 10 января 2011

Зубчатый массив - это массив массивов. Каждый массив не гарантированно имеет одинаковый размер. Вы могли бы иметь

int[][] jaggedArray = new int[5][];
jaggedArray[0] = { 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
8 голосов
/ 10 января 2011

Прямоугольный массив всегда имеет одинаковое количество столбцов для каждой строки.

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 = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}

Эта может быть интересной статьей для вас.

4 голосов
/ 10 января 2011

Объявление 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 };
1 голос
/ 10 января 2011

Для № 1 см. этот вопрос SO

Для неровных или многомерных встроенных массивов см. Это руководство по программированию :

// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
// Same array with dimensions specified.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };

Вам не нужно указывать размеры (array3D), но если вы знаете, что они никогда не изменятся, полезно знать, какие измерения вы используете (array3Da).

1 голос
/ 10 января 2011

Встроенная декларация будет выглядеть примерно так:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
1 голос
/ 10 января 2011

Если вы ищете многомерный массив с установленными границами, всегда используйте синтаксис стиля [,]. Это обеспечит одинаковый размер каждой порции.

Когда вы используете [][], на самом деле вы создаете массив массивов. Это означает, что каждый массив может иметь разные размеры. Например:

int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
    jaggedArray[index] = new int[index + 1];
}
0 голосов
/ 01 февраля 2018

Я думаю, что 2d зубчатые массивы выделяют память в C # как 2d массивы в C ++ и C. Поскольку 2d зубчатые массивы имеют указатель, который указывает на массив указателей, каждый из которых указывает на массив элементов (например, целочисленные элементы);как и этот код в C ++,

int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
   2DArr[i] = new int[number2];
}

выделение памяти для кода, приведенного ниже, такое же, как для двумерных зубчатых массивов в C #.Но я сомневаюсь, не могли бы вы объяснить больше, если я ошибаюсь.

0 голосов
/ 10 января 2011

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

Ваш Jagged массив в c # являетсямассив объектов, которые по очереди являются массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...