2011-08-26 13 views
11

En C#, es posible inicializar una matriz multidimensional utilizando constantes de este modo:Inicialización matrices multidimensionales en C# (con otros arreglos)

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

Personalmente pienso inicializar una matriz con constantes cifrados duros es una especie de inútil para cualquier cosa que no sean ejercicios de prueba. De todos modos, lo que necesito desesperadamente hacer es inicializar una nueva matriz multidimensional como la anterior utilizando matrices existentes. (Que tienen el mismo recuento de elementos, pero los contenidos, por supuesto, solo se definen en tiempo de ejecución).

Una muestra de lo que me gustaría hacer es.

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

Desafortunadamente, esto no se compila como código válido. Curiosamente, cuando traté

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

El código hizo compilar y ejecutar, sin embargo, el resultado no fue el deseado - una matriz de 3 por 3 de los objetos, lo que salió fue una matriz de 3 por 1 de las matrices, cada uno de los cuales tenía 3 elementos. Cuando eso sucede, no puedo acceder a mi matriz mediante:

Object val = twodArray[3,3]; 

tengo que ir:

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

que obviamente no es el resultado deseado.

Entonces, ¿hay alguna manera de inicializar esta nueva matriz 2D desde varias matrices existentes sin recurrir a la iteración?

+0

se oponga [] {primera, segunda, tercera}; tiene sentido en lugar de Object [,] {first, second, third}; (eliminar coma dimensional)? debe notarse como twoarray [3] [3] –

Respuesta

4

Esto funcionaría si se cambiara a matrices dentadas:

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

Editar Para aclarar a las personas para encontrar este hilo en el futuro muestra

El código anterior también es inadecuada, ya que da lugar a una matriz de matrices (objeto [objeto []]) en lugar de una matriz dentada (objeto [] []) que son conceptualmente lo mismo pero distintos tipos.

+0

. Me doy cuenta de que es posible una matriz de matrices, pero hay un número igual de elementos en cada fila, por lo que una matriz 2D es realmente la estructura que estoy buscando. Una matriz multidimensional crea una buena disposición de memoria lineal, mientras que una matriz dentada implica varios niveles adicionales de indirección. – Alain

+1

También, para el registro, intenté 'int [] [] jagged = new [] {arr1, arr2, arr3};' pero lo que obtuve fue un int [3] [] (segunda dimensión no inicializada) y los primeros 3 los artículos son matrices. Bien podría haber hecho 'int [] jagged = new [] {arr1, arr2, arr3};' – Alain

+0

Punto razonable, en ese caso la respuesta es no, no hay una manera de inicializar una matriz multidimensional de esta manera utilizando exclusivamente la sintaxis de inicializador de matriz :( – MattDavey

0

Estoy luchando por comprender completamente lo que realmente está tratando de lograr. Si lo hice bien, tiene algunas "listas" de cadenas, que necesita almacenar en otra lista.

En primer lugar, le recomendaría utilizar un enfoque más moderno que las matrices. C# le ofrece IEnumerable <> y IList <> interfaces y todas las cosas que se derivan de ellas, por lo que no es necesario seguir con las matrices antiguas.

se podría hacer algo como esto:

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

Entonces, si desea acceder a "foo6" se escribe:

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

, ¿desde cuándo las matrices están anticuadas? Casi todas las clases de colección en .NET son poco más que arreglos decorados. – MattDavey

+0

Estaba usando cadenas como ejemplo. Estoy tratando de armar una matriz 2D de objetos. No es una matriz 1D de matrices. – Alain

1

Usted está intentando asignar referencias de matriz a una matriz.Para más detalles, lea - Jagged Arrays.

probar esto,

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(); 
    } 
Cuestiones relacionadas