Matriz de longitud desconocida en C #

81

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?

UnkwnTech
fuente

Respuestas:

115

Se debe asignar una longitud a las matrices. Para permitir cualquier número de elementos, use la Listclase.

Por ejemplo:

List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3
Samuel
fuente
3
List<int[]> myInts = new List<int[]>();podría funcionar.
Nicolas Tyler
1
Si se debe asignar una longitud a las matrices, ¿por qué puedo hacer esto? String [] arr = "test; the; values; now" .Split (';'); y solo determina la longitud? Y, sin embargo, no puedo tomar esa misma línea de código y mover la declaración de variable a otra línea.
matthew_360
@ matthew_360 Dentro de la función de división, la matriz en realidad se llama con un tamaño fijo. Ejemplo: referenceource.microsoft.com/#mscorlib/system/…
Hutch
Con respecto a su respuesta "Arrays must be assigned a length", en un staticmétodo fuera de Main(), hice la declaración String[] tokens = nully no la inicialicé, pero ¿cómo es que pude invocarla "Hello.World".Split('.')sin obtener un System.NullReferenceExceptionerror?
Minh Tran
40

Úselo List<>para crear una 'matriz' de longitud desconocida.

Úselo List<>.ToArray()para devolver una matriz real, y no una List.

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();
TFD
fuente
Para mí, la Lista resolvió el problema del tamaño desconocido y luego .ToArray () creó la matriz que necesitaba.
dev1998
2
utilizando System.Collections.Generic;
PodTech.io
20

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 a List, se agrega a la matriz. Inicialmente, Listcomienza con una matriz que creo que tiene una longitud de 16. Cuando intentas agregar el elemento 17 al List, 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 bien Listpuede 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 .

JulianR
fuente
1
Esta es precisamente la información que buscaba. Muy acertado y mucho más informativo que la mayoría de las otras respuestas. +1
Carrie Kendall
16

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.

mqp
fuente
Todos estos son nulos. Pruébelo string[] words = new string(',', size - 1).Split(',');ahora están inicializados con "".
Bitterblue
3

Utilice ArrayListif en .NET 1.x, o List<yourtype>if en .NET 2.0 o 3.x.

Búscalos en System.Collectionsy System.Collections.Generics.

Diego Jancic
fuente
2

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.

Crash893
fuente
1
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!");
yfeldblum
fuente
1

prueba una lista genérica en lugar de una matriz

Hannoun Yassir
fuente
1

En pocas palabras, utilice Colecciones y Genéricos.

Es imprescindible para cualquier desarrollador de C #, vale la pena dedicar tiempo a aprender :)

Principiante
fuente
1

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.

winwaed
fuente
1

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];
Ken Janka
fuente
de manera similar, para una matriz de una dimensión, escribiré: var x = new int [n];
Ken Janka