2016-01-18 15 views
14

Ich möchte einfach ein Array von zweidimensionalen Arrays erstellen, um Koordinatenpunkte zu speichern.Erstellen eines Arrays von zweidimensionalen Arrays in C#

Also ich möchte ein Array, wo jeder Index ein zweidimensionales Array zurückgibt, die ich als x und y verwenden würde.

Hier ist, was ich versucht habe:

waypoints = new int[4][,] { 
     {{0},{6, 0}}, 
     {{1},{1, 1}}, 
     {{2},{1, 5}}, 
     {{3},{6, 5}} 
    }; 

Ich weiß, das wahrscheinlich dumm aussieht, aber ich habe versucht, es nach oben auf Google suchen, und ich habe keine guten Ergebnisse bekommen.

Es gibt einen Fehler:

"error CS0623: Array initializers can only be used in a variable or field initializer. Try using a new expression instead "

Ich habe auch versucht, es so zu tun:

waypoints = new int[4][,] { 
     new int[,] {6, 0}, 
     new int[,] {1, 1}, 
     new int[,] {1, 5}, 
     new int[,] {6, 5} 
     }; 

dies einen Fehler gibt:

"error CS0846: A nested array initializer was expected"

+0

Mögliche doppelte von [Weglassen C# neu aus gezackter Feldinitialisierung] (http://stackoverflow.com/questions/14492279/omitting-c-sharp-new-from-jagged-array-initialization) – ardila

+1

Warum eine Liste von 'Vector2' structs nicht erstellen oder etwas ähnliches? Es kann einfacher sein, auf lange Sicht mit zu arbeiten und einfacher zu sein. – rhughes

+1

@rhughes: Ganz zu schweigen von einer besseren Fundstelle (eine wichtige Überlegung für die L-n-Caches in aktuellen Prozessoren) und einer reduzierten Speicherbereinigung (da * Arrays * ein Objekt und Strukturen nicht sind). –

Antwort

11

Noch eine geschweifte Klammer {} gesetzt ist erforderlich in der Erstanmeldung:

Dies liegt daran, dass für ein solches 2D-Array jedes Element im Array als Array für die Initialisierung betrachtet wird (obwohl es normalerweise für jedes Element des Arrays verwendet wird, z. B. val[0,0] = 4;).

Edit (nach dem Feedback von Kommentaren):

im Gegensatz Put mit int[][] (bekannt als jagged array, das heißt: Array von Arrays, deren Anordnungs-Elemente kann aus different size sein), int[,] ist ein 2D-Array mit fixed dimension . Beide sind Arrays, die Arrays speichern, und daher ist jedes Element des Arrays ein Array. Dies erklärt, warum eine weitere geschweifte Klammer wie oben beschrieben in die Initialisierung eingefügt werden muss.

Solcher 2D-Array, wenn anders initialisiert, wird in anderer Dimension führt (und somit gibt es mehr Möglichkeiten, um es zu initialisieren):

int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1] 
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2] 

In beide Weise zusätzlicher Satz von geschweiften Klammer benötigt.

Für die Unterschiede zwischen jagged array und mehrdimensional, fester Größe, Anordnung, sind therealreadyplentygoodexplanations/benchmarkingavailableonline aus renommierten Quellen. Und ich verstehe, dass es, abgesehen vom Interesse des OP, für mich nicht wichtig wäre, mehr Informationen darüber zu geben. (Und daher ist der Umfang dieser Antwort ursprünglich nur darauf gerichtet, die fehlgeschlagene Initialisierung zu beantworten).

Es versteht sich, dass die Lösung nicht am besten zum Speichern von Koordinatenpunkten (wie von OP) verwendet wird. Die obige Erläuterung dient dazu, zu erklären, warum seine Initialisierung nicht funktioniert, anstatt die beste Lösung zum Speichern von Koordinatenpunkten zu liefern. Für das Speichern von Koordinatenpunkten ist in der System.Drawingstruct angemessener (wie im Kommentar vorgeschlagen).

Die Verwendung von 2D-Array in 2D einzigen Punkt darzustellen Cartesian coordinate ist ein „Overkill“, als ein 1D-Array ist bereits in der Lage, wie viele Nummern zu speichern, wie der Computer ermöglicht, viel mehr als zwei Zahlen erforderliche Punkte zu speichern, in kartesianischen Koordinatensystem.

+0

Danke! Wenn Sie erklären könnte, warum das so ist, würde ich glücklich sein :) – MysticPing

+0

Ich glaube, das ist am besten in der MSDN von Microsoft erklärt: https://social.msdn.microsoft.com/Forums/en-US/283a69b0-169f-4178- 88ce-1b71079897a2/Differenz zwischen-simple-Array-und-zackig-Array Forum = csharplanguage PS: aber wenn man Punkt gespeichert werden soll, es kann sich lohnen, sie zu speichern, mit '' Point' – Ian

+0

CLASS' ich glaube 'neue int [,] {{6,0}} 'würde genügen und würde wohl besser lesbar sein. – ardila

12

Es gibt eine einfache Antwort darauf. Verwenden Sie Instanzen der Klasse "System.Drawing.Point". Erstellen Sie ein "Point" -Array zum Speichern von Koordinaten. Um das Array zu erstellen:

Und um den Array (z. B. an Position 0) einen Wert zuzuweisen, verwenden Sie den folgenden Code.

points[0] = new Point(xvalue,yvalue);//Where "xvalue" and "yvalue" are integer variables. 

Und um die X- und Y-Werte von einer Instanz der Punktklasse zu erhalten. Verwenden Sie den folgenden Code.

int xvalue = points[0].X; 

int yvalue = points[0].Y; 

P.S. Sie können diese Punkte verwenden Standorte Kontrollen zuweisen, aber das ist eine andere Geschichte^_^

+1

Danke, krank nachschlagen! – MysticPing

2

Die Arrays sind zweidimensional und haben unbekannte Größe, die initializer Arrays verschiedener Größen definieren:

 var waypoints = new int[4][,] { 
       new int[,] { {1, 2, 6}, {3, 4, 5} }, // two rows, 3 columns 
       new int[,] { {1, 1}, {1, 2} } , // 2 x 2 
       new int[,] { {1, 5} }, // 1 x 2 
       new int[,] { {6, 5} } 
       }; 
Verwandte Themen