2011-01-30 13 views
43

¿Es posible cambiar el tamaño de una matriz después de la declaración? Si no, ¿hay alguna alternativa a las matrices?
No quiero crear una matriz con un tamaño de 1000, pero no sé el tamaño de la matriz cuando la estoy creando.cambiar el tamaño de la matriz

Respuesta

47

No, intente utilizar un List fuertemente tipado en su lugar.

Por ejemplo:

En lugar de utilizar

int[] myArray = new int[2]; 
myArray[0] = 1; 
myArray[1] = 2; 

usted puede hacer esto:

List<int> myList = new List<int>(); 
myList.Add(1); 
myList.Add(2); 

Listas utilizan matrices para almacenar los datos para que pueda obtener el beneficio velocidad de matrices con la conveniencia de LinkedList al poder agregar y eliminar elementos sin tener que preocuparse por tener que cambiar manualmente cambiar su tamaño.

Esto no significa que el tamaño de una matriz (en este caso, un List) no se haya modificado, de ahí el énfasis en la palabra manualmente.

Tan pronto como su matriz llegue a su tamaño predefinido, el JIT asignará una nueva matriz en el montón que es dos veces el tamaño y copiará su matriz existente.

47

Puede utilizar Array.Resize(), documentada en MSDN.

Pero sí, estoy de acuerdo con Corey, si necesita una estructura de datos de tamaño dinámico, tenemos List s para eso.

Importante: Array.Resize()no cambia de tamaño la matriz (el nombre del método es engañosa), se crea una nueva matriz y sólo reemplaza el reference se pasa al método.

Un ejemplo:

var array1 = new byte[10]; 
var array2 = array1; 
Array.Resize<byte>(ref array1, 20); 

// Now: 
// array1.Length is 20 
// array2.Length is 10 
// Two different arrays. 
+0

Si Array.Resize() es solo una vez al principio (y no varias veces durante el programa), ¿es eso más adecuado que una lista? –

+4

'List ' usa una matriz detrás de escena, por lo que hay muy pocas razones para usar una matriz en C#. Las listas se pueden inicializar a un tamaño adecuado utilizando este constructor: http://msdn.microsoft.com/en-us/library/dw8e0z9z.aspx. Pero sí, si su corazón está configurado en Arrays, es mejor redimensionarlos con la menor frecuencia posible. –

+0

Pensé que la lista usa una lista vinculada o alguna estructura de datos detrás. Entonces usa una matriz después de todo. – dpp

4

Utilice un List<T> lugar. Por ejemplo, en lugar de una matriz de enteros

private int[] _myIntegers = new int[1000]; 

uso

private List<int> _myIntegers = new List<int>(); 

tarde

_myIntegers.Add(1); 
9

Puede utilizar Array.Resize() en .NET 3.5 y superior. Este método asigna una nueva matriz con el tamaño especificado, copia elementos de la matriz anterior a la nueva, y luego reemplaza la matriz anterior por la nueva. (Por lo tanto, necesitará la memoria disponible para ambas matrices ya que probablemente use Array.Copy debajo de las cubiertas)

+0

Debería haber comentado, esta publicación no es una respuesta! –

+4

Solo puedo ver agregar comentarios en mi propia publicación por alguna razón – DerpDerp

+0

La razón es que su reputación es baja. – Christian

4

En C#, las matrices no pueden redimensionarse dinámicamente.

  • Un método consiste en utilizar System.Collections.ArrayList lugar de un native array.

  • Otra solución (más rápido) es reasignar la matriz con un tamaño diferente y para copiar los contenido de la matriz de edad a la nueva matriz.

    La función genérica resizeArray (abajo) se puede utilizar para hacer eso.

    public static System.Array ResizeArray (System.Array oldArray, int newSize) 
        { 
         int oldSize = oldArray.Length; 
         System.Type elementType = oldArray.GetType().GetElementType(); 
         System.Array newArray = System.Array.CreateInstance(elementType,newSize); 
    
         int preserveLength = System.Math.Min(oldSize,newSize); 
    
         if (preserveLength > 0) 
         System.Array.Copy (oldArray,newArray,preserveLength); 
    
        return newArray; 
        } 
    
    public static void Main() 
         { 
         int[] a = {1,2,3}; 
         a = (int[])ResizeArray(a,5); 
         a[3] = 4; 
         a[4] = 5; 
    
         for (int i=0; i<a.Length; i++) 
           System.Console.WriteLine (a[i]); 
         } 
    
-1

utilizar una lista genérica (System.Collections.Generic.List).

3
private void HandleResizeArray() 
    { 
     int[] aa = new int[2]; 
     aa[0] = 0; 
     aa[1] = 1; 

     aa = MyResizeArray(aa); 
     aa = MyResizeArray(aa); 
    } 

    private int[] MyResizeArray(int[] aa) 
    { 
     Array.Resize(ref aa, aa.GetUpperBound(0) + 2); 
     aa[aa.GetUpperBound(0)] = aa.GetUpperBound(0); 
     return aa; 
    } 
+0

¿Qué haces al hacer UpperBound? – whihathac

5

utilizado este enfoque para la matriz de bytes:

Inicialmente:

byte[] bytes = new byte[0]; 

Siempre que sea necesario (necesidad de proporcionar longitud original para extender):

Array.Resize<byte>(ref bytes, bytes.Length + requiredSize); 

Reset:

Array.Resize<byte>(ref bytes, 0); 

Lista Typed Método

Inicialmente:

List<byte> bytes = new List<byte>(); 

Siempre que sea necesario:

bytes.AddRange(new byte[length]); 

LANZAMIENTO/Borrar:

bytes.Clear() 
4

En C#, Array.Resize es el método más sencillo para cambiar el tamaño de cualquier matriz de nuevo tamaño, por ejemplo:

Array.Resize<LinkButton>(ref area, size); 

Aquí, quiero cambiar el tamaño del tamaño de la matriz de la matriz LinkButton:

<LinkButton> = especifica la matriz escriba
ref area = ref es una palabra clave y 'área' es el nombre de la matriz
size = nuevo tamaño de la matriz

1

Sí, es posible resi ze una matriz.Por ejemplo:

int[] arr = new int[5]; 
// increase size to 10 
Array.Resize(ref arr, 10); 
// decrease size to 3 
Array.Resize(ref arr, 3); 

Si se crea una matriz con el método CreateInstance(), el método de cambio de tamaño() no está funcionando. Por ejemplo:

// create an integer array with size of 5 
var arr = Array.CreateInstance(typeof(int), 5); 
// this not work 
Array.Resize(ref arr, 10); 

El tamaño de la matriz no es dinámico, incluso podemos cambiar su tamaño. Si desea una matriz dinámica, creo que podemos usar una lista genérica en su lugar.

var list = new List<int>(); 
// add any item to the list 
list.Add(5); 
list.Add(8); 
list.Add(12); 
// we can remove it easily as well 
list.Remove(5); 
foreach(var item in list) 
{ 
    Console.WriteLine(item); 
} 
1

Utilice una lista (donde T es cualquier tipo de objeto o) cuando se desea añadir/eliminar los datos, ya que el cambio de tamaño matrices es caro. Puede leer más sobre Arrays considered somewhat harmful, mientras que una lista se puede agregar a los nuevos registros se pueden agregar al final. Ajusta su tamaño según sea necesario.

Una lista puede ser initalized en las formas siguientes

Uso de inicializador de colección.

List<string> list1 = new List<string>() 
{ 
    "carrot", 
    "fox", 
    "explorer" 
}; 

Utilizando la palabra clave var con el inicializador de recopilación.

var list2 = new List<string>() 
{ 
    "carrot", 
    "fox", 
    "explorer" 
}; 

Utilizando nueva matriz como parámetro.

string[] array = { "carrot", "fox", "explorer" }; 
List<string> list3 = new List<string>(array); 

Usando la capacidad en el constructor y la asignación.

List<string> list4 = new List<string>(3); 
list4.Add(null); // Add empty references. (Not Recommended) 
list4.Add(null); 
list4.Add(null); 
list4[0] = "carrot"; // Assign those references. 
list4[1] = "fox"; 
list4[2] = "explorer"; 

Uso del método Agregar para cada elemento.

List<string> list5 = new List<string>(); 
list5.Add("carrot"); 
list5.Add("fox"); 
list5.Add("explorer"); 

Así, para una lista de objetos se puede ubicar y asignar las propiedades de los objetos en línea con la inicialización de lista. Los inicializadores de objeto y los inicializadores de recopilación comparten una sintaxis similar.

class Test 
{ 
    public int A { get; set; } 
    public string B { get; set; } 
} 

Inicializar la lista con el inicializador de recopilación.

List<Test> list1 = new List<Test>() 
{ 
    new Test(){ A = 1, B = "Jessica"}, 
    new Test(){ A = 2, B = "Mandy"} 
}; 

Inicializar la lista con nuevos objetos.

List<Test> list2 = new List<Test>(); 
list2.Add(new Test() { A = 3, B = "Sarah" }); 
list2.Add(new Test() { A = 4, B = "Melanie" }); 
0

Esto funcionó bien para mí para crear una matriz dinámica a partir de una matriz de clases.

var s = 0; 
var songWriters = new SongWriterDetails[1]; 
foreach (var contributor in Contributors) 
{ 
    Array.Resize(ref songWriters, s++); 
    songWriters[s] = new SongWriterDetails(); 
    songWriters[s].DisplayName = contributor.Name; 
    songWriters[s].PartyId = contributor.Id; 
    s++; 
} 
Cuestiones relacionadas