2013-07-24 4 views
5

Я путаюсь между двойным [] [] и двойным [,] в C#.
Мой товарищ по команде дать мне функцию, как это:C#: double [] [] и double [,]

public double[][] Do_Something(double[][] A) 
{ 
    ....... 
} 

Я хочу использовать эту функцию:

double[,] data = survey.GetSurveyData(); //Get data 
double[,] inrma = Do_Something(data); 

Это приводит к ошибке: недопустимый аргумент.
Я не хочу редактировать код моего товарища по команде.
Есть ли способ конвертировать double[][] в double [,]?

Спасибо!

+10

'double [] []' - это зубчатый массив. 'double [,]' - многомерный массив. Они определенно не одного типа, и их использование сильно отличается. Используйте правильный тип для правильной задачи. –

+0

Возможный дубликат [Почему у нас есть как зубчатый массив, так и многомерный массив?] (Http://stackoverflow.com/questions/4648914/why-we-have-both-jagged-array-and-multidimentional-array) и [Что это различия между многомерным массивом и массивом массивов в C#?] (http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c) –

+0

Знаете ли вы или ваши товарищи по команде, в чем разница между ними? –

ответ

8

double[][] и double[,] имеют разные значения.

double[][] зубчатый, поэтому некоторые элементы могут иметь разную длину, чем другие.

double[,] является «прямоугольным», поэтому все элементы имеют одинаковую длину.

Вы можете написать метод «конвертировать» между двумя, но как вы исправите различия? То есть как вы решите «обрезать» из длинных элементов или развернуть короткие элементы, чтобы сделать его прямоугольным?

9

double[][] является массивом двойной [] (массив массивов) , но double[,] является одной 2-мерном двойной массив

Пример:

double[] Array1 = new double[] {1,2,3}; 
double[] Array2 = new double[] {4,5,6}; 
double[][] ArrayOfArrays = new double[][] {Array1,Array2}; 
double[,] MultidimensionalArray = new double[,] {{1,2}, {3,4}, {5,6}, {7,8}}; 
1
static T[,] Convert<T>(T[][] array) 
{ 
    if (array == null) 
     throw new ArgumentNullException("array"); 
    if (array.Length == 0) 
     return new T[0, 0]; 
    T[,] retval = new T[array.Length, array[0].Length]; 
    for (int i = 0; i < array.Length; i++) 
     for (int j = 0; j < array[i].Length; j++) 
      if (array[i].Length != retval.GetLength(1)) 
       throw new Exception(); 
      else 
       retval[i, j] = array[i][j]; 
    return retval; 
} 
+1

Это работает только с не зубчатым зубчатым массивом, чтобы работать со всеми входами, вы можете использовать 'width = array.Max (a => a.Length)' и заполнить пустые слоты 'default (T)'. Если вы хотите иметь чек, вы должны переместить его на уровень, поэтому он проверяется только один раз на строку, а не на каждую ячейку. – RoadieRich

1

Они два различных типа массивов.

double[][] - массив с зубчатыми колесами, представляющий собой массив массивов; каждый из этих массивов может иметь разную длину, что приводит к проблеме.

double[,] - всего лишь многомерный массив. Каждая строка будет иметь равное количество столбцов, и каждый столбец будет иметь равное количество строк.

Это различие в размерах вызывает проблему, поскольку зубчатый массив действительно может быть разных размеров для разных строк. Вы могли бы написать метод для преобразования между этими двумя, если бы вы знали точные размеры массива с зубцами, но в этом случае я бы предложил переписать исходный метод для принятия и возврата многомерного массива (double[,]).

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