C# Matriz dinámica (ArrayList)

Colecciones de C#

ArrayList es una clase de matriz dinámica proporcionada en C#, ubicada en el espacio de nombres System.Collections.

La matriz dinámica (ArrayList) se diferencia de una matriz normal en que su tamaño se puede ajustar dinámicamente, sin necesidad de definir una longitud fija de antemano.

La matriz dinámica (ArrayList) representa una colección ordenada de objetos a los que se puede indexar individualmente; también permite asignación dinámica de memoria, adición, búsqueda y ordenación de elementos en la lista.

ArrayListEsta clase es adecuada para operaciones de matrices que requieren ajustes frecuentes de tamaño, pero debido a su naturaleza no genérica, en el desarrollo moderno de C# está siendo gradualmenteList<T>reemplazada.

Estructura básica

public class ArrayList : ICollection, IEnumerable, IList, ICloneable

Interfaces implementadas:

  • Interfaces implementadas:
    • IList: admite el acceso a elementos por índice.
    • ICollection: admite operaciones básicas de colección, como agregar, eliminar y contar.
    • IEnumerable: admite recorrer los elementos mediante un enumerador.
    • ICloneable: admite clonaciónArrayList。

Características

Expansión dinámica:

  • ArrayListLa capacidad de ArrayList se puede ajustar automáticamente según sea necesario, sin necesidad de especificar un tamaño fijo.
  • Cuando los elementos agregados exceden la capacidad actual,ArrayListla capacidad aumenta automáticamente (generalmente al doble de la capacidad original).

Colección no genérica:

  • ArrayListEs una colección no genérica, todos los elementos se almacenan comoobjecttipo object. Esto significa que puede almacenar objetos de cualquier tipo, pero hay que tener en cuenta el impacto en el rendimiento del boxing y unboxing.

Sin ordenar:

  • Aunque el orden de almacenamiento de los elementos coincide con el orden de inserción, no proporciona una función de ordenación incorporada.

Seguridad para subprocesos:

  • Por defecto no es seguro para subprocesos. Si se necesita un ArrayList seguro para subprocesos,ArrayList, se puede utilizarArrayList.Synchronizedel método para generar una versión segura para subprocesos.

Métodos y propiedades de la clase ArrayList

La siguiente tabla enumeraArrayListalgunos de los más utilizados de la clasepropiedades:

Nombre de la propiedadTipoDescripción
CountintObtieneArrayListel número de elementos contenidos en ArrayList.
CapacityintObtiene o estableceArrayListla capacidad (espacio de almacenamiento) de ArrayList.
IsFixedSizeboolIndicaArrayListsi ArrayList tiene un tamaño fijo.
IsReadOnlyboolIndicaArrayListsi ArrayList es de solo lectura.
IsSynchronizedboolIndicaArrayListsi ArrayList es seguro para subprocesos.
SyncRootobjectObtiene un objeto que se puede utilizar para la sincronización del acceso.

La siguiente tabla enumeraArrayListalgunos de los más utilizados de la clasemétodos:

Nombre del métodoTipo de retornoDescripción
Agregar e insertar
Add(object value)intAgrega un objeto alArrayListfinal de ArrayList y devuelve el índice del nuevo elemento.
AddRange(ICollection c)voidAgrega todos los elementos de la colección especificada alArrayListfinal de ArrayList.
Insert(int index, object value)voidInserta un objeto en el índice especificado.
InsertRange(int index, ICollection c)voidInserta todos los elementos de la colección especificada en el índice especificado.
Eliminación
Remove(object value)voidElimina la primera aparición del objeto especificado.
RemoveAt(int index)voidElimina el elemento en el índice especificado.
RemoveRange(int index, int count)voidElimina una cantidad especificada de elementos a partir del índice especificado.
Clear()voidElimina todos los elementos.
Acceso y consulta
Contains(object item)boolDeterminaArrayListsi ArrayList contiene el objeto especificado.
IndexOf(object value)intObtiene el índice de la primera aparición del objeto especificado.
LastIndexOf(object value)intObtiene el índice de la última aparición del objeto especificado.
Ordenación y copia
Sort()voidOrdena según el orden predeterminadoArrayListlos elementos de ArrayList.
Sort(IComparer comparer)voidOrdena según un comparador personalizado.
Reverse()voidInvierteArrayListel orden de los elementos de ArrayList.
CopyTo(Array array)voidva aArrayListCopia los elementos de ArrayList a la matriz especificada.
Otros
GetRange(int index, int count)ArrayListObtiene un subconjunto de elementos de una cantidad especificada a partir del índice especificado.
ToArray()object[]va aArrayListCopia los elementos de ArrayList a una matriz.
TrimToSize()voidAjusta la capacidad al número real de elementos para ahorrar memoria.

Ejemplo

El siguiente ejemplo demuestra el concepto de la matriz dinámica (ArrayList):

Ejemplo

using System;
using System.Collections;

namespace CollectionApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // Crear la matriz dinámica e inicializarla
            ArrayList numbers = InitializeArrayList();

            // Mostrar la capacidad y el número de elementos de la matriz
            DisplayArrayListInfo(numbers);

            // Mostrar el contenido de la matriz
            Console.Write("Original Content: ");
            DisplayArrayListContent(numbers);

            // Ordenar el contenido de la matriz
            numbers.Sort();

            // Mostrar el contenido ordenado
            Console.Write("Sorted Content: ");
            DisplayArrayListContent(numbers);

            Console.ReadKey(); // Esperar a que el usuario presione una tecla para salir
        }

        /// <summary>
        /// Inicializa y llena el ArrayList
        /// </summary>
        /// <returns>ArrayList que contiene los datos iniciales</returns>
        static ArrayList InitializeArrayList()
        {
            ArrayList al = new ArrayList();
            Console.WriteLine("Adding numbers to the ArrayList:");
           
            // Agregar elementos iniciales
            int[] initialNumbers = { 45, 78, 33, 56, 12, 23, 9 };
            foreach (int num in initialNumbers)
            {
                al.Add(num);
                Console.WriteLine($"Added: {num}");
            }

            return al;
        }

        /// <summary>
        /// Muestra la capacidad y el número de elementos del ArrayList
        /// </summary>
        /// <param name="al">Objeto ArrayList</param>
        static void DisplayArrayListInfo(ArrayList al)
        {
            Console.WriteLine($"\nCapacity: {al.Capacity}"); // Capacidad actual
            Console.WriteLine($"Count: {al.Count}");         // Número actual de elementos
        }

        /// <summary>
        /// Muestra el contenido del ArrayList
        /// </summary>
        /// <param name="al">Objeto ArrayList</param>
        static void DisplayArrayListContent(ArrayList al)
        {
            foreach (int num in al)
            {
                Console.Write(num + " ");
            }
            Console.WriteLine(); // Nueva línea
        }
    }
}

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Adding numbers to the ArrayList:
Added: 45
Added: 78
Added: 33
Added: 56
Added: 12
Added: 23
Added: 9

Capacity: 16
Count: 7
Original Content: 45 78 33 56 12 23 9 
Sorted Content: 9 12 23 33 45 56 78 

Con la colección genéricaList<T>comparación

CaracterísticaArrayListList<T>
Seguridad de tiposNo (almacenaobjecttipo object)Sí (genérico, restricción de tipo fuerte)
Boxing y unboxingSí (requerido para tipos de valor)no
RendimientoBajoAlto
Compatibilidad con genéricosNingunotener
Escenarios de usoCódigo heredado o escenarios simplesSe prefiere en el desarrollo moderno

Precauciones

Evitar el boxing y unboxing frecuentes:

  • Si los datos son principalmente tipos de valor, se recomienda usarList<T>para evitar la sobrecarga de rendimiento.

Usar con precaución datos de tipos mixtos:

  • Evite almacenar objetos de diferentes tipos mezclados para reducir el riesgo de errores en tiempo de ejecución.

Alternativas:

  • En el desarrollo moderno de C#, se recomienda utilizar colecciones genéricas (comoList<T>、Dictionary<TKey, TValue>) para mejorar la seguridad y eficiencia del código.

Colecciones de C#

Otras extensiones