Проблема статического создания массива решается при помощи использования другого класа данных языка С#. В пространстве имен System.Collections имеется встроенный класс с названием ArrayList. Если мы объявляем объект этого класса, мы получаем массив, который в большинстве отношений функционирует как простой массив, но может расти, если его начальный или текущий размер оказывается недостаточным. Поэтому можно объявить:
Using System.Collections;
…
ArrayList constant = new constants(100);
и если число объектов превысит 100, это не будет иметь никакого значения. Массив будет расширен системой насколько нужно и как только в этом возникнет необходимость. Число, указываемое в предложении, которое создает начальный список, является лишь оценкой ожидаемого размера массива.
В таблице 1 приведены свойства и методы класса ArrayList.
Таблица 1 – свойства и методы класса ArrayList
int count | возвращает число занятых элементов в списке |
int BinarySearch(v) | просматривают список в поисках значения v, ища любое вхождение, требует упорядоченного массива |
bool Contains(v) | просматривают список в поисках значения v,ища любое вхождение, возвращает true или false |
void Clear(first, num) | удаляет из списка все элементы |
int IndexOf(v) | просматривают список в поисках значения v, ища первое вхождение |
int LastIndexOf(v) | просматривают список в поисках значения v, ища последнее вхождение |
void removeAt(i) | удаляет элемент с индексом /. |
void Sort() | упорядочивает массив а, так что его элементы выстраиваются в возрастающем порядке. |
void Array ToArray(type) | копирует элементы в массив данного типа |
К сожалению, ArrayList также имеет свои недостатки. По сравнению с массивами коллекции ArrayList работают гораздо медленнее и занимают больше оперативной памяти. Происходит это из-за особенностей коллекций, которые, собственно, и создают удобство их использование (возможность добавлять и удалять элементы из середины коллекции). Если вы создаёте массив, то его размер будет равен количеству элементов массива помноженному на размер каждого элемента. Например, для массива с 10 элементами типа Integer выделяется 10*4=40 байт. Затем для считывания элемента массива вычисляется его положение в памяти на основании номера элемента и размера элементов и затем считывается нужный участок памяти. С коллекциями всё иначе. Каждый элемент коллекции представлен не одной переменной, содержащей его значение, а структурой данных. Она содержит указатель на данные элемента, ссылки на предыдущий и следующий элемент коллекции. Естественно, такая структура будет занимать больше пространства в оперативной памяти, чем одна единственная переменная. Доступ к данным в коллекции также организуется по-особому. Для получения, например, пятого элемента, коллекция перебирает все элементы, начиная с первого, пока не дойдёт до нужного индекса