2016-01-18 27 views
14

Voglio semplicemente creare una matrice di array bidimensionali per memorizzare punti di coordinate.Creazione di una matrice di array bidimensionali in C#

Quindi voglio un array in cui ogni indice restituisce un array bidimensionale che utilizzerei come x e .

Ecco che cosa ho provato:

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

Mi rendo conto che probabilmente sembra stupido, ma ho provato a guardare in su su Google, e non ho ottenuto alcun risultato buono.

dà un errore:

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

Ho anche provato a fare in questo modo:

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

Questo dà un errore:

"error CS0846: A nested array initializer was expected"

+0

Eventuali duplicati di [Omettere C# nuovo dall'inizializzazione jagged dell'array] (http://stackoverflow.com/questions/14492279/omitting-c-sharp-new-from-jagged-array-initialization) – ardila

+1

Perché non creare un elenco di strutture 'Vector2' o qualcosa di simile? Potrebbe essere più facile lavorare con e più semplice a lungo termine. – rhughes

+1

@rhughes: per non parlare della migliore localizzazione di riferimento (una considerazione importante per le cache L-n nei processori correnti) e della garbage collection ridotta (come * le matrici * sono un oggetto e le strutture non lo sono). –

risposta

11

più Uno parentesi graffa set {} è richiesto nella dichiarazione iniziale:

Ciò è dovuto al fatto che per tale array 2D, ogni elemento nell'array viene considerato come una matrice per l'inizializzazione (anche se viene in genere utilizzato per elemento dell'array come val[0,0] = 4;).

Edit (dopo il feedback da commenti):

Mettere in contrasto con int[][] (noto come jagged array, cioè: array di array cui membro di matrice può essere di different size), int[,] è una matrice 2D con fixed dimension . Entrambi sono array che memorizza gli array e quindi ogni elemento dell'array è un array. Questo spiega perché è necessario inserire un'altra parentesi graffa nella sua inizializzazione come sopra.

Tale matrice 2D, se inizializzato in modo diverso, si tradurrà in dimensione diversa (e quindi ci sono diversi modi per inizializzare esso):

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

In entrambi i casi, ulteriore insieme di parentesi graffa è necessaria.

Per le differenze tra jagged array e multidimensionale, dimensioni, matrice fissa, there sono alreadyplentygoodexplanations/benchmarkingavailableonline da fonti ben reputati. E capisco che non sarebbe significativo, a parte l'interesse dell'OP, per me mettere più informazioni a riguardo. (E quindi lo scopo di questa risposta è originariamente diretto solo a rispondere all'inizializzazione fallita).

Resta inteso che la soluzione non è la migliore per la memorizzazione dei punti di coordinate (come fatto da OP). La spiegazione sopra è data per spiegare perché la sua inizializzazione non funziona, piuttosto che fornire la migliore soluzione per la memorizzazione dei punti di coordinate. Per quanto riguarda la memorizzazione dei punti di coordinate, Point nello System.Drawingstruct sarà più corretto (come suggerito nel commento).

L'uso di array 2D per rappresentare un singolo punto in 2D Cartesian coordinate è un "overkill", in quanto un array 1D è già in grado di memorizzare quanti numeri consente il computer, molto più di due numeri necessari per memorizzare punti in cartesiano sistema di coordinate.

+0

Grazie! Se potessi spiegare il motivo per cui sarei felice :) – MysticPing

+0

Credo che questo sia meglio spiegato da Microsoft nel MSDN: https://social.msdn.microsoft.com/Forums/en-US/283a69b0-169f-4178- 88ce-1b71079897a2/difference-between-simple-array-and-jagged-array? Forum = csharplanguage PS: ma se vuoi memorizzare point, potrebbe valere la pena di memorizzarlo usando 'Point'' class' – Ian

+0

Credo 'nuovo int [,] {{6,0}} 'sarebbe sufficiente e sarebbe probabilmente più leggibile – ardila

12

C'è una risposta semplice a questo. Utilizzare le istanze della classe "System.Drawing.Point". Creare una matrice "Punto" per memorizzare le coordinate. Per creare la matrice:

Point[] points = new Point[4]; 

E per assegnare un valore alla matrice (ad esempio in posizione 0) utilizzare il seguente codice.

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

E per ottenere i valori X e Y da un'istanza della classe di punti. Usa il codice qui sotto.

int xvalue = points[0].X; 

int yvalue = points[0].Y; 

P.S. È possibile utilizzare questi punti per assegnare posizioni ai controlli, ma questa è un'altra storia^_^

+1

Grazie, lo guardo male! – MysticPing

2

Gli array sono bidimensionali e hanno dimensioni sconosciute, l'inizializzazione può definire array di varie dimensioni:

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