2013-07-24 18 views
5

Ich verwechsle zwischen Double [] [] und Double [,] in C#.
Meine Mitspieler geben Sie mir eine Funktion wie folgt aus:C#: double [] [] und double [,]

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

Ich möchte diese Funktion nutzen:

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

ein Fehler führen: ungültiges Argument.
Ich möchte den Code meines Teamkollegen nicht bearbeiten.
Gibt es eine Möglichkeit, double[][] in double [,] zu konvertieren?

Danke!

+10

'double [] []' ist ein gezacktes Array. 'double [,]' ist ein mehrdimensionales Array. Sie sind definitiv nicht der gleiche Typ, und ihre Verwendungen unterscheiden sich ziemlich viel. Verwenden Sie den richtigen Typ für die richtige Aufgabe. –

+0

mögliche Duplikate von [Warum haben wir sowohl gezackte Array und Multidimensional-Array?] (Http://stackoverflow.com/questions/4648914/why-we-have-both-jagged-array-and-multimentional-array) und [Was sind die Unterschiede zwischen Multidimensionalen Array und Array von Arrays in C#?] (http://stackoverflow.com/questions/597720/what-is-differences-between-multidimensional-array-and-array-of-arrays-in-c) –

+0

Sind Sie oder Ihre Teamkollegen sicher, was ist der Unterschied zwischen ihnen? –

Antwort

8

double[][] und double[,] haben unterschiedliche Bedeutungen.

double[][] ist gezackt, daher können einige Elemente andere Längen haben als andere.

double[,] ist "rechteckig", also sind alle Elemente gleich lang.

Sie könnten eine Methode zum "Konvertieren" zwischen den beiden schreiben, aber wie werden Sie die Unterschiede korrigieren? I.e. Wie wirst du dich entscheiden, die langen Elemente zu "trimmen" oder die kurzen Elemente zu erweitern, um sie rechteckig zu machen?

9

A double[][] ist eine Anordnung von Doppel [] (ein Array von Arrays) aber double[,] ist, ein einzelnes 2-dimensionalen Doppel Array

Beispiel:

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

Das funktioniert nur mit einem nicht gezackten gezackten Array, um mit allen Eingaben zu arbeiten, können Sie 'width = array.Max (a => a.Length)' benutzen und die leeren Slots mit 'default (T)' füllen. Wenn Sie den Check-in dort haben möchten, sollten Sie es eine Ebene verschieben, so dass es nur einmal pro Zeile und nicht für jede Zelle überprüft wird. – RoadieRich

1

Es sind zwei verschiedene Typen von Arrays.

double[][] ist ein gezacktes Array, das ein Array von Arrays ist; Jedes dieser Arrays kann eine unterschiedliche Länge haben, was zu einem Problem führt.

double[,] ist nur ein mehrdimensionales Array. Jede Zeile hat die gleiche Anzahl von Spalten und jede Spalte hat die gleiche Anzahl von Zeilen.

Dieser Größenunterschied verursacht ein Problem, da das gezackte Array wirklich unterschiedliche Dimensionen für verschiedene Zeilen haben könnte. Sie könnten eine Methode zum Konvertieren zwischen den beiden schreiben, wenn Sie die genauen Abmessungen des gezackten Arrays kennen, aber in diesem Fall würde ich vorschlagen, die ursprüngliche Methode zum Akzeptieren und Zurückgeben eines mehrdimensionalen Arrays (double[,]) neu zu schreiben.

Verwandte Themen