[C#] Array de una clase. Aumentar dimensiones

Iniciado por Sr Limone, 31 Agosto 2015, 00:21 AM

0 Miembros y 1 Visitante están viendo este tema.

Sr Limone

Hola! Justo me acabo de registrar en este foro por que no encuentro solución a este pequeño problema. Espero y me puedan ayudar jeje.

Supongamos que tengo una clase llamada Persona y hago un array de la misma, es decir, algo así como:


Código (csharp) [Seleccionar]
Persona[] personas = new[50] Persona();

¿Cómo hago para que este array aumente sus dimensiones conforme lo valla requiriendo?
Espero haberme explicado y que me puedan ayudar. Muchas gracias :)

kub0x

Bienvenido a la comunidad Sr Limone.

Supongo que estarás aprendiendo programación. Cuando instancias un array con un tamaño fijo y se te queda pequeño debes de redimensionarlo haciendo uno más grande y copiando el contenido del viejo al nuevo.

En .NET como bien sabrás estas cosillas no las tienes que implementar o programar, bastaría con utilizar la clase ArrayList, la cual subyacente o por debajo hace el redimensionamiento al quedarse sin espacio o bien, con llamar al método Array.Resize() conseguirías el mismo resultado.

Saludos.
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


Eleкtro

#2
Aparte de lo ya mencionado, también podrías usar una colección genérica de tipo List<T>, al igual que un ArrayList pero con miembros más productivos, hace uso de un buffer de arrays para almacenar los datos, los cuales son redimensionados dinámicamente (internamente) utilizando los métodos List.Add() y List.Remove() (entre otros).

Código (c#) [Seleccionar]
List<persona> personas = new List<persona>();
personas.Add(persona individual);
personas.AddRange(array de persona);


ArrayList, List<T>, ambas maneras son más productivas que utilizar un Array nativo.

No existe manera de redimensionar dinámicamente un Array, para redimensionar el tamaño de asignación debes usar Array.Resize cómo ya han comentado, aunque una manera más óptima en cuestión de velocidad sería copiar el contenido del antiguo array a uno nuevo:

Código (vbnet) [Seleccionar]
Public Shared Function ResizeArray(sourceArray As Array, newSize As Integer) As Array

   Dim preserveLength As Integer = Math.Min(sourceArray.Length, newSize)

   If (preserveLength > 0) Then
       Dim newArray As Array = Array.CreateInstance(sourceArray.GetType.GetElementType, newSize)
       Array.Copy(sourceArray, newArray, preserveLength)
       Return newArray

   Else
       Return sourceArray

   End If

End Function


Código (vbnet) [Seleccionar]
Dim myArray(50) As Integer
Debug.WriteLine(String.Format("{0,-12}: {1}", "Initial Size", myArray.Length))

myArray = DirectCast(ResizeArray(myArray, myArray.Length + 50), Integer())
Debug.WriteLine(String.Format("{0,-12}: {1}", "New Size", myArray.Length))


Conversión online a C#:

Código (csharp) [Seleccionar]
public static Array ResizeArray(Array sourceArray, int newSize)
{

int preserveLength = Math.Min(sourceArray.Length, newSize);

if ((preserveLength > 0)) {
Array newArray = Array.CreateInstance(sourceArray.GetType.GetElementType, newSize);
Array.Copy(sourceArray, newArray, preserveLength);
return newArray;

} else {
return sourceArray;

}

}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================


Código (csharp) [Seleccionar]
int[] myArray = new int[51];
Debug.WriteLine(string.Format("{0,-12}: {1}", "Initial Size", myArray.Length));

myArray = (int[])ResizeArray(myArray, myArray.Length + 50);
Debug.WriteLine(string.Format("{0,-12}: {1}", "New Size", myArray.Length));


Saludos