Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Sr Limone en 31 Agosto 2015, 00:21 am



Título: [C#] Array de una clase. Aumentar dimensiones
Publicado por: Sr Limone en 31 Agosto 2015, 00:21 am
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
  1. 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 :)


Título: Re: [C#] Array de una clase. Aumentar dimensiones
Publicado por: kub0x en 31 Agosto 2015, 01:26 am
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.


Título: Re: [C#] Array de una clase. Aumentar dimensiones
Publicado por: Eleкtro en 31 Agosto 2015, 11:31 am
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
  1. List<persona> personas = new List<persona>();
  2. personas.Add(persona individual);
  3. 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
  1. Public Shared Function ResizeArray(sourceArray As Array, newSize As Integer) As Array
  2.  
  3.    Dim preserveLength As Integer = Math.Min(sourceArray.Length, newSize)
  4.  
  5.    If (preserveLength > 0) Then
  6.        Dim newArray As Array = Array.CreateInstance(sourceArray.GetType.GetElementType, newSize)
  7.        Array.Copy(sourceArray, newArray, preserveLength)
  8.        Return newArray
  9.  
  10.    Else
  11.        Return sourceArray
  12.  
  13.    End If
  14.  
  15. End Function

Código
  1. Dim myArray(50) As Integer
  2. Debug.WriteLine(String.Format("{0,-12}: {1}", "Initial Size", myArray.Length))
  3.  
  4. myArray = DirectCast(ResizeArray(myArray, myArray.Length + 50), Integer())
  5. Debug.WriteLine(String.Format("{0,-12}: {1}", "New Size", myArray.Length))

Conversión online a C#:

Código
  1. public static Array ResizeArray(Array sourceArray, int newSize)
  2. {
  3.  
  4. int preserveLength = Math.Min(sourceArray.Length, newSize);
  5.  
  6. if ((preserveLength > 0)) {
  7. Array newArray = Array.CreateInstance(sourceArray.GetType.GetElementType, newSize);
  8. Array.Copy(sourceArray, newArray, preserveLength);
  9. return newArray;
  10.  
  11. } else {
  12. return sourceArray;
  13.  
  14. }
  15.  
  16. }
  17.  
  18. //=======================================================
  19. //Service provided by Telerik (www.telerik.com)
  20. //=======================================================

Código
  1. int[] myArray = new int[51];
  2. Debug.WriteLine(string.Format("{0,-12}: {1}", "Initial Size", myArray.Length));
  3.  
  4. myArray = (int[])ResizeArray(myArray, myArray.Length + 50);
  5. Debug.WriteLine(string.Format("{0,-12}: {1}", "New Size", myArray.Length));

Saludos