C# Динамический массив (ArrayList)
ArrayList — это класс динамического массива, предоставляемый в C#, находящийся в пространстве имен System.Collections.
Динамические массивы (ArrayList) отличаются от обычных массивов тем, что их размер можно изменять динамически, без необходимости заранее задавать фиксированную длину.
Динамический массив (ArrayList) представляет упорядоченную коллекцию объектов, к которым можно обращаться по отдельности по индексу, а также позволяет динамически распределять память, добавлять, искать и сортировать элементы в списке.
ArrayListЭтот класс подходит для операций с массивами, требующих частого изменения размера, но из-за его необобщенного характера в современной разработке на C# его постепенно [заменяют на List<T>].List<T>замену.
Базовая структура
public class ArrayList : ICollection, IEnumerable, IList, ICloneable
Реализует интерфейс:
- Реализует интерфейс:
IList: Поддерживает доступ к элементам по индексу.ICollection: Поддерживает базовые операции с коллекцией, такие как добавление, удаление и подсчёт.IEnumerable: Поддерживает перебор элементов с помощью перечислителя.ICloneable: Поддерживает клонированиеArrayList。
Особенности
Динамическое расширение:
ArrayListЕё вместимость может автоматически подстраиваться по мере необходимости, без указания фиксированного размера.- Когда количество добавленных элементов превышает текущую вместимость,
ArrayListОна автоматически увеличивает вместимость (обычно удваивая исходную вместимость).
Необобщённые коллекции:
ArrayListЭто необобщённая коллекция, и все элементы хранятся какobjectтип. Это означает, что она может хранить объекты любого типа, но следует обратить внимание на влияние на производительность упаковки и распаковки.
Неупорядоченная работа:
- Хотя порядок хранения элементов совпадает с порядком добавления, она не предоставляет встроенной функции сортировки.
Потокобезопасность:
- По умолчанию она не является потокобезопасной. Если требуется потокобезопасная [реализация],
ArrayList, можно использоватьArrayList.SynchronizedМетод создаёт потокобезопасную версию.
Методы и свойства класса ArrayList
В таблице ниже перечисленыArrayListНекоторые распространённые способы использования классаСвойство:
| Имя атрибута | Type | Описание |
|---|---|---|
Count | int | ПолучитьArrayListКоличество содержащихся элементов. |
Capacity | int | Получить или задатьArrayListЕмкость (пространство для хранения). |
IsFixedSize | bool | УказываетArrayListИмеет ли он фиксированный размер. |
IsReadOnly | bool | УказываетArrayListЯвляется ли он доступным только для чтения. |
IsSynchronized | bool | УказываетArrayListЯвляется ли он потокобезопасным. |
SyncRoot | object | Возвращает объект, который можно использовать для синхронизированного доступа. |
В таблице ниже перечисленыArrayListНекоторые распространённые способы использования классаМетоды:
| Название метода | Тип возвращаемого значения | Описание |
|---|---|---|
| Добавление и вставка | ||
Add(object value) | int | Добавляет объект вArrayListВ конце, возвращает индекс нового элемента. |
AddRange(ICollection c) | void | Добавляет все элементы указанной коллекции вArrayListконца. |
Insert(int index, object value) | void | Вставляет объект по указанному индексу. |
InsertRange(int index, ICollection c) | void | Вставляет все элементы указанной коллекции по указанному индексу. |
| Delete | ||
Remove(object value) | void | Удаляет первое вхождение указанного объекта. |
RemoveAt(int index) | void | Удаляет элемент по указанному индексу. |
RemoveRange(int index, int count) | void | Удаляет указанное количество элементов, начиная с указанного индекса. |
Clear() | void | Удаляет все элементы. |
| Доступ и выполнение запросов | ||
Contains(object item) | bool | Принятие решенийArrayListСодержит ли он указанный объект. |
IndexOf(object value) | int | Получает индекс первого вхождения указанного объекта. |
LastIndexOf(object value) | int | Получает индекс последнего вхождения указанного объекта. |
| Сортировка и копирование | ||
Sort() | void | Сортирует в порядке по умолчанию.ArrayListЭлементы внутри. |
Sort(IComparer comparer) | void | Сортирует в соответствии с пользовательским компаратором. |
Reverse() | void | ReverseArrayListПорядок элементов в |
CopyTo(Array array) | void | будетArrayListКопирует элементы в указанный массив. |
| Другое | ||
GetRange(int index, int count) | ArrayList | Получает подмножество указанного количества элементов, начиная с указанного индекса. |
ToArray() | object[] | будетArrayListКопирует элементы в массив. |
TrimToSize() | void | Настраивает емкость по фактическому количеству элементов для экономии памяти. |
Пример
В следующем примере демонстрируется концепция динамических массивов (ArrayList):
Пример
using System.Collections;
namespace CollectionApplication
{
class Program
{
static void Main(string[] args)
{
// Создать динамический массив и инициализировать его
ArrayList numbers = InitializeArrayList();
// Вывести емкость массива и количество элементов
DisplayArrayListInfo(numbers);
// Вывести содержимое массива
Console.Write("Исходное содержимое: ");
DisplayArrayListContent(numbers);
// Сортировать содержимое массива
numbers.Sort();
// Отобразить отсортированное содержимое
Console.Write("Отсортированное содержимое: ");
DisplayArrayListContent(numbers);
Console.ReadKey(); // Ожидать нажатия клавиши пользователем для выхода
}
/// <summary>
/// Инициализировать и заполнить ArrayList
/// </summary>
/// <returns>ArrayList, содержащий исходные данные</returns>
static ArrayList InitializeArrayList()
{
ArrayList al = new ArrayList();
Console.WriteLine("Добавление чисел в ArrayList:");
// Добавить начальные элементы
int[] initialNumbers = { 45, 78, 33, 56, 12, 23, 9 };
foreach (int num in initialNumbers)
{
al.Add(num);
Console.WriteLine($"Добавлено: {num}");
}
return al;
}
/// <summary>
/// Отображает вместимость и количество элементов ArrayList
/// </summary>
/// <param name="al">Объект ArrayList</param>
static void DisplayArrayListInfo(ArrayList al)
{
Console.WriteLine($"\nВместимость: {al.Capacity}"); // текущая вместимость
Console.WriteLine($"Количество: {al.Count}"); // Текущее количество элементов
}
/// <summary>
/// Отображает содержимое ArrayList
/// </summary>
/// <param name="al">Объект ArrayList</param>
static void DisplayArrayListContent(ArrayList al)
{
foreach (int num in al)
{
Console.Write(num + " ");
}
Console.WriteLine(); // новая строка
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
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
и обобщенные коллекцииList<T>сравнение
| Особенности | ArrayList | List<T> |
|---|---|---|
| Типобезопасность | Нет (типobjectхранения) | Да (обобщенный, строго типизированное ограничение) |
| Упаковка и распаковка | Да (требуется для типов значений) | нет |
| Производительность | Относительно низкая | Повышенный |
| Поддержка обобщений | Отсутствует | Да |
| Сценарий использования | Устаревший код или простые сценарии | Предпочтительно в современной разработке |
Примечания
Избегайте частой упаковки и распаковки:
- Если данные в основном состоят из типов значений, рекомендуется использовать [List<T>]
List<T>чтобы избежать накладных расходов на производительность.
С осторожностью используйте данные смешанных типов.:
- Старайтесь не смешивать и не хранить объекты разных типов, чтобы снизить риск ошибок времени выполнения.
Альтернативное решение:
- В современной разработке на C# рекомендуется использовать обобщённые коллекции (такие как
List<T>、Dictionary<TKey, TValue>), чтобы повысить безопасность и эффективность кода.