Многомерный массив [] [] vs [,]
592399 просмотра
5 ответа
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 Источник Размещён: 12.11.2019 09:47Ответы (5)
462 плюса
Один - это массив массивов, а второй - это двумерный массив. Первый может быть зазубренным, последний является однородным.
То есть, 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:44211 плюса
В первом случае вы пытаетесь создать так называемый зубчатый массив.
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]
, Относится к элементу в первой строке третьего столбца.
Иллюстрированный представитель вашего двумерного массива
58 плюса
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 плюса
double[,]
2d массив (матрица), в то время double[][]
как массив массивов ( неровных массивов ) и синтаксис:
double[][] ServicePoint = new double[10][];
Автор: Omar
Размещён: 24.09.2012 02:45
8 плюса
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
Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- arrays Как удалить дубликаты из массива C #?
- arrays Как определить размер моего массива в C?
- arrays Каков наилучший способ конвертировать массив в хеш в Ruby
- arrays Сравнение двухбайтовых массивов в .NET
- arrays Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- arrays Haxe итерация на динамическом
- multidimensional-array Как вы вращаете двумерный массив?
- multidimensional-array Проверка, является ли массив многомерным или нет?
- multidimensional-array Как «сгладить» многомерный массив в простой в PHP?
- multidimensional-array Каковы различия между многомерным массивом и массивом массивов в C #?
- multidimensional-array Преобразование 2-мерного массива
- multidimensional-array Нахождение соседей в двумерном массиве