520 Stimmen

Mehrdimensionales Array [][] vs [,]

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

Was ist der Unterschied? (1) einen Fehler ergibt, was ist der Grund dafür?

Und

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

mit (2) wird eine Fehlermeldung angezeigt. Warum?

574voto

James Michael Hare Punkte 36545

Eines ist ein Array von Arrays und eines ist ein 2d-Array. Ersteres kann zackig sein, letzteres ist gleichmäßig.

Das heißt, ein double[][] gültig sein kann:

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];

Da jeder Eintrag in dem Array ein Verweis auf ein Array von double . Mit einem gezackten Array können Sie eine Zuweisung an ein Array vornehmen, wie Sie es in Ihrem zweiten Beispiel wünschen:

x[0] = new double[13];

Beim zweiten Element können Sie, da es sich um ein einheitliches 2D-Array handelt, kein 1D-Array einer Zeile oder Spalte zuweisen, da Sie sowohl die Zeile als auch die Spalte indizieren müssen, was Sie auf eine einzige double :

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

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

UPDATE :

Um zu klären, basierend auf Ihre Frage, der Grund, warum Ihre #1 hatte einen Syntaxfehler ist, weil Sie diese hatten:

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

Und Sie können den zweiten Index zum Zeitpunkt der Konstruktion nicht angeben. Der Schlüssel ist, dass ServicePoint ist no ein 2d-Array, sondern ein 1d-Array (von Arrays), und da Sie also ein 1d-Array (von Arrays) erstellen, geben Sie nur einen Index an:

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

Wenn Sie dann jedes Element im Array erstellen, ist jedes dieser Elemente ebenfalls ein Array, also dann können Sie deren Abmessungen angeben (die unterschiedlich sein können, daher der Begriff zerklüftet Array):

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

240voto

Prabhu Murthy Punkte 8951

Im ersten Fall versuchen Sie, ein so genanntes gezacktes Array zu erstellen.

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

Die obige Aussage hätte funktioniert, wenn sie wie unten definiert worden wäre.

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

Dies bedeutet, dass Sie ein Array der Größe 10 erstellen, in dem 10 unterschiedlich große Arrays gespeichert werden können, in einfachen Worten ein Array von Arrays, siehe das folgende Bild, das ein gezacktes Array darstellt.

enter image description here

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

Die zweite ist im Grunde ein zweidimensionales Array und die Syntax ist korrekt und akzeptabel.

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

Und um auf ein zweidimensionales Array zuzugreifen oder es zu ändern, müssen Sie beide Dimensionen übergeben, aber in Ihrem Fall übergeben Sie nur eine einzelne Dimension, daher der Fehler

Die korrekte Verwendung wäre

ServicePoint[0][2] Bezieht sich auf eine Position in der ersten Zeile, dritte Spalte.

Bildliche Darstellung Ihres zweidimensionalen Arrays

enter image description here

71voto

Adil Punkte 143047

double[][] werden genannt zerklüftete Arrays Die inneren Abmessungen sind in der Erklärung nicht angegeben. Im Gegensatz zu einer rechteckige Anordnung kann jedes innere Feld eine beliebige Länge haben. Jedes innere Array wird implizit mit null initialisiert und nicht mit einem leeren Array. Jedes innere Array muss manuell erstellt werden: Referenz [C# 4.0 in Nutshell Die endgültige Referenz]

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[,] werden genannt rectangular arrays die durch Kommas voneinander getrennt werden. Der folgende Code deklariert ein rechteckiges zweidimensionales 3 x 3-Array und initialisiert es mit Zahlen von 0 bis 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;

25voto

Omar Punkte 15583

double[,] ein 2d-Array (Matrix) ist, während double[][] ist ein Array von Arrays ( zerklüftete Arrays ) und die Syntax lautet:

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

9voto

Ivo Punkte 8053

double[][] ist ein Array von Arrays und double[,] ist eine Matrix. Wenn Sie ein Array von Array initialisieren wollen, müssen Sie dies tun:

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

Berücksichtigen Sie, dass Sie mit Arrays von Arrays Arrays unterschiedlicher Länge haben können:

ServicePoint[0] = new double[10];
ServicePoint[1] = new double[3];
ServicePoint[2] = new double[5];
//and so on...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X