2011-08-26 17 views
11

In C#, è possibile inizializzare un array multidimensionale usando le costanti in questo modo:Inizializzazione array multidimensionali in C# (con altri array)

Object[,] twodArray = new Object[,] { {"00", "01", "02"}, 
             {"10", "11", "12"}, 
             {"20", "21", "22"} }; 

personalmente ritengo inizializzare un array con costanti codificati duri viene praticamente inutile per altro che esercizi di prova. Ad ogni modo, ciò di cui ho disperatamente bisogno è inizializzare un nuovo array multidimensionale come sopra usando gli array esistenti. (Che hanno lo stesso numero di elementi, ma i contenuti sono ovviamente definiti solo in fase di esecuzione).

Un esempio di ciò che vorrei fare è.

Object[] first = new Object[] {"00", "01", "02"}; 
Object[] second = new Object[] {"10", "11", "12"}; 
Object[] third = new Object[] {"20", "21", "22"}; 
Object[,] twodArray = new Object[,] { first, second, third }; 

Sfortunatamente, questo non viene compilato come codice valido. Abbastanza divertente, quando ho provato

Object[,] twodArray = new Object[,] { {first}, {second}, {third} }; 

Il codice fatto compilare ed eseguire, ma il risultato non è stato come desiderato - 3 da 3 serie di oggetti, ciò che è venuto fuori è stato un 3 da 1 array di array, ognuno dei quali aveva 3 elementi. Quando ciò accade, non posso accedere al mio array usando:

Object val = twodArray[3,3]; 

devo andare:

Object val = twodArray[3,1][3]; 

che ovviamente non è il risultato desiderato.

Quindi, c'è un modo per inizializzare questo nuovo array 2D da più array esistenti senza ricorrere all'iterazione?

+0

Vuol Object [] {primo, secondo, terzo}; ha senso invece di Object [,] {first, second, third}; (rimuovere il coma di dimensione)? dovrebbe essere notato come twoarray [3] [3] –

risposta

4

Questo potrebbe funzionare se si è cambiato per gli array frastagliati:

int[] arr1 = new[] { 1, 2, 3 }; 
int[] arr2 = new[] { 4, 5, 6 }; 
int[] arr3 = new[] { 7, 8, 9 }; 

int[][] jagged = new[] { arr1, arr2, arr3 }; 

int six = jagged[1][2]; 

Modifica Per chiarire per le persone che trovano questa discussione in futuro campione

Il codice di cui sopra è anche inadeguata in quanto si traduce in un array di matrici (oggetto [oggetto []]) piuttosto che una matrice frastagliata (oggetto [] []) che sono concettualmente la stessa cosa ma tipi distinti.

+0

Realizzo una matrice di matrici è possibile, ma ci sono un numero uguale di elementi in ogni riga, e quindi un array 2D è davvero la struttura che sto cercando. Una matrice multidimensionale crea un bel layout di memoria lineare mentre una matrice frastagliata implica diversi livelli aggiuntivi di riferimento indiretto. – Alain

+1

Inoltre, per la cronaca, ho provato 'int [] [] jagged = new [] {arr1, arr2, arr3};' ma quello che ho ottenuto è stato un int [3] [] (seconda dimensione non inizializzata) e il primo 3 gli oggetti sono matrici. Potremmo anche aver fatto 'int [] jagged = new [] {arr1, arr2, arr3};' – Alain

+0

Fair point, in tal caso la risposta è no, non c'è un modo per inizializzare un array multidimensionale in questo modo esclusivamente usando la sintassi di inizializzazione dell'array :( – MattDavey

0

Sto lottando per comprendere appieno cosa stai cercando di raggiungere. Se ho capito bene, hai alcune "liste" di stringhe, che devi memorizzare in un altro elenco.

Prima di tutto, ti consiglio di utilizzare un approccio più moderno rispetto agli array. C# ti offre le interfacce IEnumerable <> e IList <> e tutte le cose che ne derivano, quindi non è necessario attenersi agli array vecchio stile.

Si potrebbe fare qualcosa di simile:

var list1 = new List<string> { "foo1", "foo2", "foo3" }; 
var list2 = new List<string> { "foo4", "foo5", "foo6" }; 
var list3 = new List<string> { "foo7", "foo8", "foo9" }; 
var listOfStrings = new List<List<string>> { list1, list2, list3 }; 

Poi, se si desidera accedere "foo6" si scrive:

var temp = listOfStrings[1][2]; 
+0

da quando gli array sono vecchio stile? Quasi tutte le classi di raccolta in .NET sono poco più di matrici decorate. – MattDavey

+0

Stavo usando le stringhe come esempio. Sto cercando di mettere insieme una matrice 2D di oggetti. Non una matrice 1D di array. – Alain

1

Si sta tentando di assegnare riferimenti ad array a un array.Per maggiori informazioni si prega di leggere - Jagged Arrays.

Prova questa,

Object[] first = new Object[] { "00", "01", "02" }; 
Object[] second = new Object[] { "10", "11", "12" }; 
Object[] third = new Object[] { "20", "21", "22" }; 
Object[][] result = { first, second, third }; 

foreach (object [] ar in result) 
    { 
     foreach (object ele in ar) 
     { 
      Console.Write(" " + ele); 
      } 
     Console.WriteLine(); 
    } 
Problemi correlati