Acabo de comenzar a aprender C # y en la introducción a las matrices mostraron cómo establecer una variable como una matriz, pero parece que uno debe especificar la longitud de la matriz en la asignación, entonces, ¿qué pasa si no sé la longitud de la matriz? ¿formación?
81
List<int[]> myInts = new List<int[]>();
podría funcionar."Arrays must be assigned a length"
, en unstatic
método fuera deMain()
, hice la declaraciónString[] tokens = null
y no la inicialicé, pero ¿cómo es que pude invocarla"Hello.World".Split('.')
sin obtener unSystem.NullReferenceException
error?Úselo
List<>
para crear una 'matriz' de longitud desconocida.Úselo
List<>.ToArray()
para devolver una matriz real, y no unaList
.var list = new List<int>(); list.Add(1); list.Add(2); list.Add(3); var array = list.ToArray();
fuente
Un poco de información básica:
Como se dijo, si desea tener una colección dinámica de cosas, use un
List<T>
. Internamente, una lista también usa una matriz para el almacenamiento. Esa matriz tiene un tamaño fijo como cualquier otra matriz. Una vez que se declara que una matriz tiene un tamaño, no cambia. Cuando agrega un elemento aList
, se agrega a la matriz. Inicialmente,List
comienza con una matriz que creo que tiene una longitud de 16. Cuando intentas agregar el elemento 17 alList
, lo que sucede es que se asigna una nueva matriz, eso es (creo) el doble del tamaño de la anterior , entonces 32 ítems. Luego, el contenido de la matriz anterior se copia en la nueva matriz. Entonces, si bienList
puede parecer dinámico para el observador externo, internamente también debe cumplir las reglas.Y como habrás adivinado, la copia y asignación de las matrices no es gratuita, por lo que uno debería apuntar a tener la menor cantidad posible de ellas y, para ello, puedes especificar (en el constructor de
List
) un tamaño inicial de la matriz, que en un escenario perfecto es lo suficientemente grande para contener todo lo que quieras. Sin embargo, esto es una microoptimización y es poco probable que alguna vez le importe, pero siempre es bueno saber lo que está haciendo realmente .fuente
Puede crear una matriz con el tamaño establecido en una variable, es decir
int size = 50; string[] words = new string[size]; // contains 50 strings
Sin embargo, ese tamaño no puede cambiar más adelante, si decide que necesita 100 palabras. Si necesita que el tamaño sea realmente dinámico, deberá utilizar un tipo diferente de estructura de datos. Prueba
List
.fuente
string[] words = new string(',', size - 1).Split(',');
ahora están inicializados con""
.Utilice
ArrayList
if en .NET 1.x, oList<yourtype>
if en .NET 2.0 o 3.x.Búscalos en
System.Collections
ySystem.Collections.Generics
.fuente
Es posible que también desee buscar en Dictionarys si sus datos son únicos. Esto le dará dos columnas para trabajar.
Nombre de usuario, factura total
le brinda muchas herramientas integradas para buscar y actualizar solo el valor.
fuente
var yummy = new List<string>(); while(person.FeelsHappy()) { yummy.Add(person.GetNewFavoriteFood()); } Console.WriteLine("Sweet! I have a list of size {0}.", list.Count); Console.WriteLine("I didn't even need to know how big to make it " + "until I finished making it!");
fuente
prueba una lista genérica en lugar de una matriz
fuente
En pocas palabras, utilice Colecciones y Genéricos.
Es imprescindible para cualquier desarrollador de C #, vale la pena dedicar tiempo a aprender :)
fuente
Como se detalla anteriormente, la lista genérica <> es la mejor manera de hacerlo.
Si está atascado en .NET 1. *, entonces tendrá que usar la clase ArrayList en su lugar. Esto no tiene verificación de tipo en tiempo de compilación y también tiene que agregar conversión, desordenado.
Las versiones sucesivas también han implementado varias variaciones, incluidas las variantes seguras para subprocesos.
fuente
Si realmente necesita usar una matriz en lugar de una lista, entonces puede crear una matriz cuyo tamaño se calcula en tiempo de ejecución así ...
por ejemplo, quiero una matriz bidimensional de tamaño n por n. n se obtendrá en tiempo de ejecución del usuario
int n = 0; bool isInteger = int.TryPase(Console.ReadLine(), out n); var x = new int[n,n];
fuente