2009-03-01 28 views
65

Acabo de empezar a aprender C# y en la introducción a las matrices mostraron cómo establecer una variable como una matriz, pero parece que se debe especificar la longitud de la matriz en la asignación, entonces ¿qué si no sé la longitud de la matriz?Matriz de una longitud desconocida en C#

Respuesta

96

A las matrices se les debe asignar una longitud. Para permitir cualquier cantidad de elementos, use la clase List.

Por ejemplo:

List<int> myInts = new List<int>(); 
myInts.Add(5); 
myInts.Add(10); 
myInts.Add(11); 
myInts.Count // = 3 
+2

¿Qué pasa si dos dimensiones? –

+1

'List myInts = new List ();' podría funcionar. –

+0

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 duración? Y, sin embargo, no puedo tomar la misma línea de código y mover la declaración de variable a otra línea. –

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!"); 
12

Se puede crear una matriz con el tamaño ajustado a una variable, es decir,

int size = 50; 
string[] words = new string[size]; // contains 50 strings 

Sin embargo, que el tamaño no puede cambiar más adelante, si usted decide que necesita 100 palabras. Si necesita que el tamaño sea realmente dinámico, deberá usar un tipo diferente de estructura de datos. Pruebe List.

+0

Estos son todos nulos. Pruebe 'string [] words = new string (',', size - 1) .Split (',');' Ahora están inicializados con '" "'. – Bitterblue

2

Utilice un ArrayList si está en .NET 1.xo un List<yourtype> si está en .NET 2.0 o 3.x.

búsquelos en System.Collections y System.Collections.Generics.

29

Usa List<> para crear una "matriz" de longitud desconocida.

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

var list = new List<int>(); 
list.Add(1); 
list.Add(2); 
list.Add(3); 
var array = list.ToArray(); 
+0

Para mí, la lista resolvió el problema del tamaño desconocido, y luego .ToArray() creó la matriz que necesitaba. – dev1998

+1

usando System.Collections.Generic; – Hariboo

1

tratar una lista genérica en lugar de gama

2

También puede ser que desee ver en dictionarys si sus datos es único, Esto le dará dos columnas a trabajar.

Nombre de usuario, factura total

le da una gran cantidad de herramientas integradas para buscar y actualizar sólo el valor.

1

En pocas palabras, utilice Colecciones y genéricos.

Es una necesidad para cualquier desarrollador de C#, vale la pena el tiempo para aprender :)

11

Un poco de información básica pasar:

Como se ha dicho, si usted quiere tener una colección dinámica de las cosas, utilizar un List<T> . Internamente, una lista utiliza una matriz para el almacenamiento también. Esa matriz tiene un tamaño fijo al igual que cualquier otra matriz. Una vez que una matriz se declara con un tamaño, no cambia. Cuando agrega un artículo a List, se agrega a la matriz. Inicialmente, el List comienza con una matriz que creo que tiene una longitud de 16. Cuando intenta agregar el 17mo elemento al List, lo que ocurre es que se asigna una nueva matriz, eso es (creo) el doble del tamaño de la viejo, entonces 32 artículos. Luego, el contenido de la matriz anterior se copia en la nueva matriz. Entonces, aunque un List puede parecer dinámico para el observador externo, internamente debe cumplir también con las reglas.

Y como ya habrás adivinado, la copia y la asignación de las matrices no es gratuita, por lo que debes intentar tener la menor cantidad posible y para hacerlo puedes especificar (en el constructor de List) una inicial tamaño de la matriz, que en un escenario perfecto es lo suficientemente grande como para contener todo lo que desee. Sin embargo, esto es una micro-optimización y es poco probable que alguna vez le importe a usted, pero siempre es bueno saber lo que realmente está haciendo.

+0

Esta es precisamente la información que estaba buscando. Spot on y mucho más informativo que la mayoría de las otras respuestas. +1 –

1

Como se detalla anteriormente, la lista genérica <> es la mejor manera de hacerlo.

Si está atrapado en .NET 1. *, tendrá que utilizar la clase ArrayList en su lugar. Esto no tiene verificación de tipos en tiempo de compilación y también tiene que agregar casting - desordenado.

Las versiones sucesivas también han implementado varias variaciones, incluidas las variantes de seguridad de subprocesos.

Cuestiones relacionadas