C# Matriz dinámica (ArrayList)
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 propiedad | Tipo | Descripción |
|---|---|---|
Count | int | ObtieneArrayListel número de elementos contenidos en ArrayList. |
Capacity | int | Obtiene o estableceArrayListla capacidad (espacio de almacenamiento) de ArrayList. |
IsFixedSize | bool | IndicaArrayListsi ArrayList tiene un tamaño fijo. |
IsReadOnly | bool | IndicaArrayListsi ArrayList es de solo lectura. |
IsSynchronized | bool | IndicaArrayListsi ArrayList es seguro para subprocesos. |
SyncRoot | object | Obtiene 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étodo | Tipo de retorno | Descripción |
|---|---|---|
| Agregar e insertar | ||
Add(object value) | int | Agrega un objeto alArrayListfinal de ArrayList y devuelve el índice del nuevo elemento. |
AddRange(ICollection c) | void | Agrega todos los elementos de la colección especificada alArrayListfinal de ArrayList. |
Insert(int index, object value) | void | Inserta un objeto en el índice especificado. |
InsertRange(int index, ICollection c) | void | Inserta todos los elementos de la colección especificada en el índice especificado. |
| Eliminación | ||
Remove(object value) | void | Elimina la primera aparición del objeto especificado. |
RemoveAt(int index) | void | Elimina el elemento en el índice especificado. |
RemoveRange(int index, int count) | void | Elimina una cantidad especificada de elementos a partir del índice especificado. |
Clear() | void | Elimina todos los elementos. |
| Acceso y consulta | ||
Contains(object item) | bool | DeterminaArrayListsi ArrayList contiene el objeto especificado. |
IndexOf(object value) | int | Obtiene el índice de la primera aparición del objeto especificado. |
LastIndexOf(object value) | int | Obtiene el índice de la última aparición del objeto especificado. |
| Ordenación y copia | ||
Sort() | void | Ordena según el orden predeterminadoArrayListlos elementos de ArrayList. |
Sort(IComparer comparer) | void | Ordena según un comparador personalizado. |
Reverse() | void | InvierteArrayListel orden de los elementos de ArrayList. |
CopyTo(Array array) | void | va aArrayListCopia los elementos de ArrayList a la matriz especificada. |
| Otros | ||
GetRange(int index, int count) | ArrayList | Obtiene 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() | void | Ajusta 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.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ística | ArrayList | List<T> |
|---|---|---|
| Seguridad de tipos | No (almacenaobjecttipo object) | Sí (genérico, restricción de tipo fuerte) |
| Boxing y unboxing | Sí (requerido para tipos de valor) | no |
| Rendimiento | Bajo | Alto |
| Compatibilidad con genéricos | Ninguno | tener |
| Escenarios de uso | Código heredado o escenarios simples | Se prefiere en el desarrollo moderno |
Precauciones
Evitar el boxing y unboxing frecuentes:
- Si los datos son principalmente tipos de valor, se recomienda usar
List<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 (como
List<T>、Dictionary<TKey, TValue>) para mejorar la seguridad y eficiencia del código.