2013-07-24 31 views
5

Confondo tra double [] [] e double [,] in C#.
mio compagno di squadra mi dia una funzione come questa:C#: double [] [] e double [,]

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

voglio usare questa funzione:

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

Si portano un errore: argomento non valido.
Non voglio modificare il codice del mio compagno di squadra.
Ha un modo per convertire double[][] in double [,]?

Grazie!

+10

'double [] []' è una matrice seghettata. 'double [,]' è un array multidimensionale. Non sono sicuramente dello stesso tipo, e i loro usi differiscono piuttosto molto. Usa il tipo giusto per il compito giusto. –

+0

possibile duplicato di [Perché abbiamo sia array frastagliato che array multidimentale?] (Http://stackoverflow.com/questions/4648914/why-we-have-both-jagged-array-and-multidimentional-ray) e [Cosa sono le differenze tra l'array multidimensionale e l'array di array in C#?] (http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c) –

+0

Siete voi o i vostri compagni di squadra sicuri di quale sia la differenza tra loro? –

risposta

8

double[][] e double[,] hanno diversi significati.

double[][] è frastagliato, quindi alcuni elementi possono essere di lunghezza diversa rispetto ad altri.

double[,] è "rettangolare", quindi tutti gli elementi sono della stessa lunghezza.

Si potrebbe scrivere un metodo per "convertire" tra i due, ma come rettificare le differenze? Cioè come sceglierai di "tagliare" dagli elementi lunghi o di espandere gli elementi corti per renderlo rettangolare?

9

Un double[][] è un array di double [] (un array di array) ma double[,] è un singolo 2 letto matrice bidimensionale

Esempio:

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

Che funziona solo con una matrice seghettata senza bordi, per lavorare con tutti gli input, puoi usare 'width = array.Max (a => a.Length)', e riempire gli spazi vuoti con 'default (T)'. Se vuoi avere il check-in, devi spostarlo di un livello, quindi viene controllato solo una volta per riga, piuttosto che per ogni cella. – RoadieRich

1

Sono due tipi diversi di array.

double[][] è una matrice seghettata, che è una matrice di matrici; ognuno di questi array può avere una lunghezza diversa, il che porta a un problema.

double[,] è solo un array multidimensionale. Ogni riga avrà un numero uguale di colonne e ogni colonna avrà un numero uguale di righe.

Questa differenza di dimensioni causa un problema poiché l'array frastagliato potrebbe essere in realtà dimensioni diverse per righe diverse. Si potrebbe scrivere un metodo per convertire tra i due se si conoscessero le dimensioni esatte dell'array frastagliato, ma in tal caso suggerirei di riscrivere il metodo originale per accettare e restituire un array multidimensionale (double[,]).