Использование классов List и ArrayList для организации массивов-списков
***Класс ArrayList
Основным недостатком обычных массивов является то, что объем памяти, необходимый для хранения их элементов, должен быть выделен до начала работы с массивом. Класс ArrayList позволяет программисту не заботиться о выделении памяти и хранить в одном и том же массиве элементы различных типов.
По умолчанию при создании объекта типа ArrayListстроится массив из 16 элементов типа object. Можно задать желаемое количество элементов в массиве, передав его вконструктор или установив в качестве значения свойства Capacity, например:
ArrayListarr1 = newArrayList(); // создается массив из 16 элементов
ArrayListarr2 = newArrayList(1000); // создается массив из 1000 элементов
ArrayList аггЗ = newArrayList();
аггЗ.Capacity = 1000; // количество элементов задается
КлассArrayListимеет множество полезных для разработчика методов и свойств, например:
· Capacity – свойство, связано с емкостью массива ( количество элементов, которые могут храниться в массиве);
· Count – свойство, фактическое количество элементов массива;
· Item – свойство, получает или устанавливает значение элемента по заданному индексу;
· Add – метод, добавление элемента в конец массива;
· Clear – метод, удаление всех элементов из массива;
· IndexOf- метод, поиск первого вхождения элемента в массив (возвращает индекс найденного элемента или -1, если элемент не найден).
· Insert – метод, вставка элемента в заданную позицию ( по заданному индексу);
· Reverse – метод, изменение порядка следования элементов на обратный;
· RemoveAt – метод, удаление элемента из массива по заданному индексу;
· Sort – метод, упорядочивание элементов массива или его части.
Класс ArrayList реализован через класс Array, то есть содержит закрытое поле этого класса. Поскольку все типы в С# являются потомками класса object, массивможет содержать элементы произвольного типа/Даже если в массиве хранятсяобычные целые числа, то есть элементы значимого типа, внутренний классявляется массивом ссылок на экземпляры типа, object, которые представляютсобой упакованный тип-значение. Соответственно, при занесении в массив выполняетсяупаковка, а при извлечении — распаковка элемента. Это не может не сказаться на быстродействии алгоритмов, использующих ArrayList.
Если при добавлении элемента в массив оказывается, что фактическое количество элементов массива превышает его емкость, она автоматически удваивается, тоесть происходит повторное выделение памяти и переписывание туда всех существующихэлементов.
Пример занесения элементов в экземпляр класса ArrayList:
arr1.Add( 123 );
arr1.Add( -2 );
arr1.Add( "Вася" );
Доступ к элементу выполняется по индексу, однако при этом необходимо явным образом привести полученную ссылку к целевому типу, например:
int a = (int) arrl[0];
int b = (int) arrl[l];
string s - (string) arrl[2]:
Попытка приведения к типу, не соответствующему хранимому в элементе, вызываетгенерацию исключения InvalidCastException.;
Для повышения надежности программ применяется следующий прием: экземпляр класса ArrayList объявляется закрытымполем класса, в котором необходимо хранить коллекцию значений определенного типа, а затем описываются методы работы с этой коллекцией, делегирующие свои функции методам ArrayList.
Недостатком этого решения является то, что для каждого метода стандартной коллекции приходится описывать метод-оболочку, вызывающий стандартный метод. Хотя это и несложно, но несколько неизящно. ВС#, начиная с версии 2.0, появились классы-прототипы (generics), позволяющие решить эту проблему.
***Класс List
Многие алгоритмы не зависят от типов данных, с которыми они работают. Простейшими примерами могут служить сортировка и поиск. Возможность отделить алгоритмы от типов данных предоставляет классы-прототипы (generics) — классы, имеющие в качестве параметров типы данных. Чаще всего эти классы применяются для хранения данных, то есть в качестве контейнерных классов, или коллекций.
Эти коллекции, расположенные в пространстве имен System.Collections.Generic, дублируют аналогичные коллекции пространства имен System.Collections.
List<T>является классом прототипом класса ArrayList.В отличии от своего предка List<T>хранит элементы одного типа или класса и производных от него классов, это делает его универсальным.
Казалось бы, по сравнению с обычными коллекциями это ограничение, а не универсальность, однако на практике коллекции, в которых действительно требуется хранить значения различных, не связанных межу собой типов, почти не используются.Достоинством же такого ограничения является то, что компилятор может выполнить контроль типов во время компиляции, а не выполнения программы,что повышает ее надежность и упрощает поиск ошибок.
В остальном он подобен своему предку.
----Отличием же от класса Array, является более широкий набор методов и свойств, однако все равно есть и недостатки, а именно невозможность задать нижнюю границу массива, возможность создать только одномерный массив с помощью классов Listи ArrayList.
Последняя проблема решается посредством создания массивов-списков. Это можно сделать следующим образом, с использованием класса Array:
List<int>[] lst = new List<int>[9];
Тут мы объявляем массив типа List<int>из 9 элементов и далее в цикле инициализируем каждый элемент массива списком:
for (int i = 0; i < 9; i++)
{
lst[i] = new List<int>() {};
}
Далее обращаться к такому массиву списку мы можем средством цикла foreach , например:
foreach (List<int> sp in lst)
{
foreach (int i in sp) Console.Write(i + " ");
Console.WriteLine();
}
Можно добавить пример самостоятельно