saber - matrices multidimensionales c#
¿Cómo inicializo una matriz vacía en C#? (12)
¿Es posible crear una matriz vacía sin especificar el tamaño?
Por ejemplo, he creado:
String[] a = new String[5];
¿Podemos crear la matriz de cadenas anterior sin el tamaño?
Aquí hay un ejemplo del mundo real. En esto es necesario inicializar la matriz foundFiles
primero a longitud cero.
(Como se enfatiza en otras respuestas: ¡Esto no inicializa un elemento y especialmente no un elemento con índice cero porque eso significaría que la matriz tenía la longitud 1. La matriz tiene una longitud cero después de esta línea!).
Si se omite la parte = string[0]
, ¡hay un error del compilador!
Esto se debe a que el bloque de captura no se vuelve a lanzar. El compilador de C # reconoce la ruta del código, que la función Directory.GetFiles()
puede lanzar una excepción, por lo que la matriz no se puede inicializar.
Antes de que alguien diga, no volver a lanzar la excepción sería un mal manejo de errores: Esto no es cierto. El manejo de errores tiene que ajustarse a los requisitos.
En este caso, se supone que el programa debe continuar en el caso de un directorio que no se puede leer, y no romper. El mejor ejemplo es una función que atraviesa una estructura de directorio. Aquí el manejo de errores es simplemente registrarlo. Por supuesto, esto podría hacerse mejor, por ejemplo, recolectando todos los directorios con GetFiles(Dir)
fallidas en una lista, pero esto llevará demasiado lejos aquí.
Es suficiente afirmar que evitar el throw
es un escenario válido, por lo que la matriz debe inicializarse hasta la longitud cero. Sería suficiente hacer esto en el bloque catch, pero este sería un estilo malo.
La llamada a GetFiles(Dir)
cambia el tamaño de la matriz.
string[] foundFiles= new string[0];
string dir = @"c:/";
try
{
foundFiles = Directory.GetFiles(dir); // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
// throw; // This would throw Exception to caller and avoid compiler error
}
foreach (string filename in foundFiles)
Console.WriteLine("Filename: " + filename);
Combinando sugerencias de @nawfal y @Kobi:
namespace Extensions
{
/// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
public static class Array<T>
{
public static readonly T[] Empty = new T[0];
}
}
Ejemplo de uso:
Array<string>.Empty
HTH
Como sé, no se puede hacer una matriz sin tamaño, pero se puede usar
List<string> l = new List<string>()
y luego l.ToArray()
.
En .Net 4.6, la forma preferida es usar un nuevo método, Array.Empty
:
String[] a = Array.Empty<string>();
La implementation es sucinta, usando cómo se comportan los miembros estáticos en clases genéricas en .Net :
public static T[] Empty<T>()
{
return EmptyArray<T>.Value;
}
// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
public static readonly T[] Value = new T[0];
}
(código del código relacionado con el contrato eliminado para mayor claridad)
Ver también:
- implementation
- Introducción a
Array.Empty<T>()
- Marc Gravell - Asignación, Asignación, Asignación - mi publicación favorita en pequeñas asignaciones ocultas.
Había intentado:
string[] sample = new string[0];
Pero solo pude insertar una cadena en ella, y luego obtuve un error de excepción de salida, así que simplemente puse un tamaño para ella, como
string[] sample = new string[100];
O de otra manera que me funcione:
List<string> sample = new List<string>();
Asignando valor a la lista:
sample.Add(your input);
No tiene mucho sentido declarar una matriz sin tamaño. Una matriz es sobre el tamaño . Cuando declara una matriz de tamaño específico, especifica el número fijo de ranuras disponibles en una colección que puede contener cosas, y en consecuencia se asigna memoria. Para agregarle algo, deberá reinicializar de todos modos la matriz existente (incluso si está redimensionando la matriz, vea esta secuencia ). Uno de los casos raros en los que desearía inicializar una matriz vacía sería pasarla como un argumento.
Si desea definir una colección cuando no sabe qué tamaño podría tener, la matriz no es su elección, sino algo como una List<T>
o similar.
Dicho esto, la única forma de declarar una matriz sin especificar el tamaño es tener una matriz vacía de tamaño 0 . hemant y Alex Dn proporcionan dos formas. Otra alternativa más simple es simplemente :
string[] a = { };
[ Los elementos dentro del corchete deben ser convertibles implícitamente al tipo definido, por ejemplo, string[] a = { "a", "b" };
]
O aún otro:
var a = Enumerable.Empty<string>().ToArray();
Aquí hay una forma más declarativa :
public static class Array<T>
{
public static T[] Empty()
{
return Empty(0);
}
public static T[] Empty(int size)
{
return new T[size];
}
}
Ahora puedes llamar:
var a = Array<string>.Empty();
//or
var a = Array<string>.Empty(5);
Prueba esto:
string[] a= new string[] { };
Puede iniciarlo con un tamaño de 0, pero tendrá que reinicializarlo cuando sepa cuál es el tamaño, ya que no puede agregarlo a la matriz.
string[] a = new string[0];
Sencillo y elegante!
string[] array = {}
Si va a utilizar una colección de la que no sabe el tamaño de antemano, hay mejores opciones que los arreglos.
Use una List<string>
lugar: le permitirá agregar tantos elementos como necesite y si necesita devolver una matriz, llame a ToArray()
a la variable.
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
Si debe crear una matriz vacía, puede hacer esto:
string[] emptyStringArray = new string[0];
Tu puedes hacer:
string[] a = { String.Empty };
Nota: OP significa no tener que especificar un tamaño, no hacer que una matriz sea importante.
Puede definir el tamaño de la matriz en tiempo de ejecución .
Esto le permitirá hacer lo que sea para calcular dinámicamente el tamaño de la matriz. Pero, una vez definido el tamaño es inmutable.
Array a = Array.CreateInstance(typeof(string), 5);