Многомерный массив [] [] vs [,]

c# arrays multidimensional-array

592399 просмотра

5 ответа

5733 Репутация автора

double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)

В чем их разница? (1) выдает ошибку, в чем причина?

А также

double d = new double[9]
ServicePoint[0] = d;

использование (2) вызовет ошибку. Почему?

Автор: william007 Источник Размещён: 24.09.2012 02:41

Ответы (5)


462 плюса

33357 Репутация автора

Решение

Один - это массив массивов, а второй - это двумерный массив. Первый может быть зазубренным, последний является однородным.

То есть, double[][]действительно может быть:

double[][] x = new double[5][];

x[0] = new double[10];
x[1] = new double[5];
x[2] = new double[3];
x[3] = new double[100];
x[4] = new double[1];

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

x[0] = new double[13];

Что касается второго элемента, поскольку он представляет собой единый 2d-массив, вы не можете назначить 1d-массив строке или столбцу, поскольку необходимо индексировать как строку, так и столбец, что сводит вас к одному double:

double[,] ServicePoint = new double[10,9];

ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.

ОБНОВЛЕНИЕ :

Чтобы уточнить на основании вашего вопроса, причина, по которой ваш # 1 имел синтаксическую ошибку, заключается в том, что у вас было это:

double[][] ServicePoint = new double[10][9];

И вы не можете указать второй индекс во время строительства. Ключевым моментом является то, что ServicePoint - это не 2d массив, а 1d массив (из массивов), и, таким образом, поскольку вы создаете 1d массив (из массивов), вы указываете только один индекс:

double[][] ServicePoint = new double[10][];

Затем, когда вы создаете каждый элемент массива, каждый из которых также являются массивами, так что тогда вы можете указать свои размеры (которые могут быть разными, поэтому термин зазубренного массив):

ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];

Надеюсь, это поможет!

Автор: James Michael Hare Размещён: 24.09.2012 02:44

58 плюса

130930 Репутация автора

double[][]называются зубчатыми массивами , внутренние размеры не указаны в объявлении. В отличие от прямоугольного массива , каждый внутренний массив может иметь произвольную длину. Каждый внутренний массив неявно инициализируется нулем, а не пустым массивом. Каждый внутренний массив должен быть создан вручную: Ссылка [C # 4.0 в двух словах Полная ссылка]

for (int i = 0; i < matrix.Length; i++)
{
    matrix[i] = new int [3]; // Create inner array
    for (int j = 0; j < matrix[i].Length; j++)
        matrix[i][j] = i * 3 + j;
}

double[,]Вызываются rectangular arrays, которые объявляются с помощью запятых для разделения каждого измерения. Следующий фрагмент кода объявляет прямоугольный двумерный массив размером 3 на 3, инициализируя его числами от 0 до 8:

int [,] matrix = new int [3, 3];
for (int i = 0; i < matrix.GetLength(0); i++)
    for (int j = 0; j < matrix.GetLength(1); j++)
        matrix [i, j] = i * 3 + j;
Автор: Adil Размещён: 24.09.2012 02:45

19 плюса

13024 Репутация автора

double[,]2d массив (матрица), в то время double[][]как массив массивов ( неровных массивов ) и синтаксис:

double[][] ServicePoint = new double[10][];
Автор: Omar Размещён: 24.09.2012 02:45

8 плюса

7017 Репутация автора

double[][]является массивом массивов и double[,]является матрицей. Если вы хотите инициализировать массив массива, вам нужно сделать это:

double[][] ServicePoint = new double[10][]
for(var i=0;i<ServicePoint.Length;i++)
    ServicePoint[i] = new double[9];

Примите во внимание, что использование массивов массивов позволит вам иметь массивы различной длины:

ServicePoint[0] = new double[10];
ServicePoint[1] = new double[3];
ServicePoint[2] = new double[5];
//and so on...
Автор: Ivo Размещён: 24.09.2012 02:49

211 плюса

8011 Репутация автора

В первом случае вы пытаетесь создать так называемый зубчатый массив.

double[][] ServicePoint = new double[10][9].

Вышеупомянутое утверждение работало бы, если бы оно было определено как ниже.

double[][] ServicePoint = new double[10][]

это означает, что вы создаете массив размером 10, который может хранить в нем 10 массивов разного размера. Проще говоря, массив массивов. Посмотрите на изображение ниже, которое обозначает зубчатый массив.

введите описание изображения здесь

http://msdn.microsoft.com/en-us/library/2s05feca(v=vs.80).aspx

Второй - в основном двумерный массив, синтаксис правильный и приемлемый.

  double[,] ServicePoint = new double[10,9];//<-ok (2)

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

Правильное использование будет

ServicePoint[0][2] , Относится к элементу в первой строке третьего столбца.

Иллюстрированный представитель вашего двумерного массива

введите описание изображения здесь

Автор: Prabhu Murthy Размещён: 24.09.2012 02:53
Вопросы из категории :
32x32