C# Динамический массив (ArrayList)

Коллекции C#

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Описание
CountintПолучитьArrayListКоличество содержащихся элементов.
CapacityintПолучить или задатьArrayListЕмкость (пространство для хранения).
IsFixedSizeboolУказываетArrayListИмеет ли он фиксированный размер.
IsReadOnlyboolУказываетArrayListЯвляется ли он доступным только для чтения.
IsSynchronizedboolУказываетArrayListЯвляется ли он потокобезопасным.
SyncRootobjectВозвращает объект, который можно использовать для синхронизированного доступа.

В таблице ниже перечислены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()voidReverseArrayListПорядок элементов в
CopyTo(Array array)voidбудетArrayListКопирует элементы в указанный массив.
Другое
GetRange(int index, int count)ArrayListПолучает подмножество указанного количества элементов, начиная с указанного индекса.
ToArray()object[]будетArrayListКопирует элементы в массив.
TrimToSize()voidНастраивает емкость по фактическому количеству элементов для экономии памяти.

Пример

В следующем примере демонстрируется концепция динамических массивов (ArrayList):

Пример

using System;
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>сравнение

ОсобенностиArrayListList<T>
ТипобезопасностьНет (типobjectхранения)Да (обобщенный, строго типизированное ограничение)
Упаковка и распаковкаДа (требуется для типов значений)нет
ПроизводительностьОтносительно низкаяПовышенный
Поддержка обобщенийОтсутствуетДа
Сценарий использованияУстаревший код или простые сценарииПредпочтительно в современной разработке

Примечания

Избегайте частой упаковки и распаковки:

  • Если данные в основном состоят из типов значений, рекомендуется использовать [List<T>]List<T>чтобы избежать накладных расходов на производительность.

С осторожностью используйте данные смешанных типов.:

  • Старайтесь не смешивать и не хранить объекты разных типов, чтобы снизить риск ошибок времени выполнения.

Альтернативное решение:

  • В современной разработке на C# рекомендуется использовать обобщённые коллекции (такие какList<T>、Dictionary<TKey, TValue>), чтобы повысить безопасность и эффективность кода.

Коллекции C#

Другие расширения