Использование классов List и ArrayList для организации массивов-списков — КиберПедия 

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Использование классов List и ArrayList для организации массивов-списков

2017-11-27 309
Использование классов List и ArrayList для организации массивов-списков 0.00 из 5.00 0 оценок
Заказать работу

***Класс 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();

}

Можно добавить пример самостоятельно


Поделиться с друзьями:

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.