¿Cuáles son todas las sintaxis de inicialización de matriz que son posibles con C #?
fuente
¿Cuáles son todas las sintaxis de inicialización de matriz que son posibles con C #?
Estos son los métodos actuales de declaración e inicialización para una matriz simple.
string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2
Tenga en cuenta que existen otras técnicas para obtener matrices, como las ToArray()
extensiones de Linq en IEnumerable<T>
.
También tenga en cuenta que en las declaraciones anteriores, los dos primeros podrían reemplazar el string[]
de la izquierda con var
(C # 3+), ya que la información de la derecha es suficiente para inferir el tipo adecuado. La tercera línea debe escribirse como se muestra, ya que la sintaxis de inicialización de la matriz por sí sola no es suficiente para satisfacer las demandas del compilador. El cuarto también podría usar inferencia. Entonces, si te gusta la brevedad, lo anterior podría escribirse como
var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2
var
variable?var x = {}
no funcione si el inicializador de matriz podría producir algo más que matrices, pero no sabría qué es eso. Así que supongo que el inicializador de matriz es una característica del lenguaje. Si lo usa connew List<string> {"A", "B"}
él, también produce algo diferente.Las sintaxis de creación de matrices en C # que son expresiones son:
En el primero, el tamaño puede ser cualquier valor integral no negativo y los elementos de la matriz se inicializan a los valores predeterminados.
En el segundo, el tamaño debe ser constante y la cantidad de elementos debe coincidir. Debe haber una conversión implícita de los elementos dados al tipo de elemento de matriz dado.
En el tercero, los elementos deben ser implícitamente convertibles al tipo de elemento, y el tamaño se determina a partir del número de elementos dados.
En el cuarto, el tipo de elemento de matriz se infiere calculando el mejor tipo, si hay uno, de todos los elementos dados que tienen tipos. Todos los elementos deben ser implícitamente convertibles a ese tipo. El tamaño se determina a partir del número de elementos dados. Esta sintaxis se introdujo en C # 3.0.
También hay una sintaxis que solo puede usarse en una declaración:
Los elementos deben ser implícitamente convertibles al tipo de elemento. El tamaño se determina a partir del número de elementos dados.
Le remito a la especificación C # 4.0, sección 7.6.10.4 "Expresiones de creación de matriz".
fuente
Array.CreateInstance(typeof(int), 3)
!"1,2,3,4".split(',')
.new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };
, y así sucesivamente paraint[,,]
,int[,,,]
, ...Matrices no vacías
var data0 = new int[3]
var data1 = new int[3] { 1, 2, 3 }
var data2 = new int[] { 1, 2, 3 }
var data3 = new[] { 1, 2, 3 }
var data4 = { 1, 2, 3 }
no es compilable Usar en suint[] data5 = { 1, 2, 3 }
lugar.Matrices vacías
var data6 = new int[0]
var data7 = new int[] { }
var data8 = new [] { }
yint[] data9 = new [] { }
no son compilablesvar data10 = { }
no es compilable Usar en suint[] data11 = { }
lugar.Como argumento de un método
Solo las expresiones que se pueden asignar con la
var
palabra clave se pueden pasar como argumentos.Foo(new int[2])
Foo(new int[2] { 1, 2 })
Foo(new int[] { 1, 2 })
Foo(new[] { 1, 2 })
Foo({ 1, 2 })
no es compilableFoo(new int[0])
Foo(new int[] { })
Foo({})
no es compilablefuente
Creará una serie de cadenas vacías repetidas veces 'contar'. En caso de que desee inicializar la matriz con el mismo valor de elemento predeterminado pero especial. Cuidado con los tipos de referencia, todos los elementos harán referencia al mismo objeto.
fuente
var arr1 = Enumerable.Repeat(new object(), 10).ToArray();
obtienes 10 referencias al mismo objeto. Para crear 10 objetos distintos, puede usarvar arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();
o similar.fuente
En caso de que desee inicializar una matriz fija de elementos iguales preinicializados (no
null
u otrosdefault
), use esto:También participe en esta discusión.
fuente
Ejemplo para crear una matriz de una clase personalizada
A continuación se muestra la definición de clase.
Así es como puede inicializar la matriz:
fuente
Repita sin LINQ :
fuente
o
o
y en matriz multidimensional
fuente
fuente
Otra forma de crear e inicializar una matriz de objetos. Esto es similar al ejemplo que @Amol ha publicado anteriormente , excepto que este usa constructores. Una pizca de polimorfismo roció, no pude resistirme.
Clases para el contexto:
fuente
Para la clase a continuación:
Puede inicializar la matriz del objeto anterior como se muestra a continuación.
Espero que esto ayude.
fuente
También puede crear matrices dinámicas, es decir, primero puede preguntar el tamaño de la matriz al usuario antes de crearla.
fuente
Solución trivial con expresiones. Tenga en cuenta que con NewArrayInit puede crear una matriz unidimensional.
fuente
Solo una nota
Las siguientes matrices:
Se compilará para:
fuente