Файл: Лабораторная работа 8 Разработка приложений с использованием коллекций.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 91
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Лабораторная работа № 8
Разработка приложений с использованием коллекций
1. Цель работы
Изучить интерфейсы и классы коллекций библиотеки .NET Framework, основные свойства и методы этих классов, применяемые при работе с коллекциями.
2. Порядок выполнения работы
– прочесть краткие теоретические сведения;
– выполнить задания раздела;
– составить отчет о лабораторной работе и защитить его у преподавателя.
3. Сведения из теории
3.1. Интерфейсы коллекций
В C# под коллекцией понимается группа объектов. Пространство имен System.Collections содержит множество интерфейсов и классов, которые определяют и реализуют коллекции различных типов (динамические массивы, стеки, очереди, словари, хеш-таблицы и т.п.).
Интерфейсы, которые поддерживают коллекции и их иерархия приведены на рисунке 3.1.
Рис. 3.1. Иерархия интерфейсов System.Collections
Интерфейс ICollection можно назвать фундаментом, на котором построены все коллекции. В нем объявлены основные методы и свойства, без которых не может обойтись ни одна коллекция. Самое востребованное свойство этого интерфейса – Count, содержит количество элементов, хранимых в коллекции в данный момент. Если свойство Count равно нулю, значит, коллекция пуста. В интерфейсе ICollection определен следующий метод:
void CopyTo(Array target, int startIdx)
Этот метод копирует содержимое коллекции в массив, заданный параметром target, начиная с индекса, заданного параметром startIdx. Можно сказать, что метод CopyTo() обеспечивает переход от коллекции к стандартному C#-массиву.
Интерфейс IList наследует интерфейс ICollection и определяет поведение коллекции, доступ к элементам которой разрешен посредством индекса с отсчетом от нуля. Помимо методов, определенных в интерфейсе ICollection, интерфейс IList определяет и собственные методы:
Метод | Описание |
int Add(object obj) | Добавляет объект obj в вызывающую коллекцию. Возвращает индекс, по которому этот объект сохранен |
void Clear() | Удаляет все элементы из вызывающей коллекции |
bool Contains (object obj) | Возвращает true, если вызывающая коллекция содержит объект obj, иначе false |
int IndexOf (object obj) | Возвращает индекс объекта obj, если он (объект) содержится в вызывающей коллекции, иначе возвращает –1 |
void Insert(int idx, object obj) | Вставляет в вызывающую коллекцию объект obj по индексу idx. Последующие элементы смещаются вперед, чтобы освободить место для вставляемого объекта |
void Remove(object obj) | Удаляет из вызывающей коллекции первое вхождение объекта obj. Последующие элементы смещаются назад |
void RemoveAt(int idx) | Удаляет из вызывающей коллекции объект, расположенный по индексу idx. Последующие элементы смещаются назад |
В интерфейсе IList определены следующие свойства:
bool IsFixedSize { get; } – равно true, если коллекция имеет фиксированный размер, т.е. в нее нельзя вставлять элементы и удалять их из нее.
bool IsReadOnly { get; } – равно true, если коллекция предназначена только для чтения, т.е. содержимое коллекции не подлежит изменению.
В интерфейсе IList определен следующий индексатор:
object this[int idx] { get; set; }
Этот индексатор можно использовать для считывания или записи значения нужного элемента (но не для добавления).
Интерфейс IDictionary определяет поведение коллекции, которая служит для хранения пар ключ/значение. Сохраненную однажды пару можно извлечь по заданному ключу. Интерфейс IDictionary наследует интерфейс ICollection. Методы, объявленные в интерфейсе IDictionary, сведены в таблице:
Метод | Описание |
void Add(object k, object v) | Добавляет в вызывающую коллекцию пару ключ/значение, заданную параметрами k и v. Ключ k не должен быть нулевым. Если ключ k уже хранится в коллекции, генерируется исключение типа ArgumentException |
void Clear() | Удаляет все пары ключ/значение из вызывающей коллекции |
bool Contains(object k) | Возвращает true, если вызывающая коллекция содержит объект k в качестве ключа, иначе false |
IDictionaryEnumerator GetEnumerator() | Возвращает нумератор для вызывающей коллекции |
void Remove(object k) | Удаляет элемент с ключом k |
В интерфейсе IDictionary определены следующие свойства:
Свойство | Описание |
bool IsFixedSize {get; } | Равно true, если словарь имеет фиксированный размер |
bool IsReadOnly { get; } | Равно true, если словарь предназначен только для чтения |
ICollection Keys { get; } | Получает коллекцию ключей |
ICollection Values { get; } | Получает коллекцию значений |
В интерфейсе IDictionary определен следующий индексатор:
object this[object key] { get; set; }
Этот индексатор можно использовать для получения или установки значения элемента, а также для добавления в коллекцию нового элемента. Следует обратить внимание на то, что «индекс» в данном случае является не обычным индексом, а ключом элемента.
Интерфейс IEnumerable должен быть реализован в любом классе, если в нем предполагается поддержка нумераторов. В этом интерфейсе определен единственный метод:
IEnumerator GetEnumerator()
Он возвращает нумератор для коллекции. Кроме того, реализация интерфейса IEnumerable позволяет получить доступ к содержимому коллекции с помощью цикла foreach.
Интерфейс IEnumerator, собственно, и определяет действие любого нумератора. Используя его методы, можно циклически опросить элементы коллекции. Для коллекций, в которых хранятся пары ключ/значение (т.е. словари), метод GetEnumerator() возвращает объект типа IDictionaryEnumerator, а не IEnumerator. Интерфейс IDictionaryEnumerator является производным от интерфейса IEnumerator и распространяет свои функциональные возможности нумератора на область словарей.
В интерфейсе IEnumerator определено единственное свойство:
object Current { get; }
Это свойство позволяет получить (но не установить) элемент, соответствующий текущему значению нумератора.
В интерфейсе IEnumerator определены два метода:
Метод | Описание |
bool MoveNext() | Перемещает текущую позицию нумератора к следующему элементу коллекции. Возвращает false, если достигнут конец коллекции, иначе true. До первого обращения к этому методу значение свойства Current не определено |
void Reset() | Устанавливает нумератор в начало коллекции |
Интерфейс IDictionaryEnumerator дополнительно определяет «свои» свойства:
Свойство | Описание |
DictionaryEntry Entry { get; } | Получает пару ключ/значение в форме структуры типа DictionaryEntry. В этой структуре определены два свойства, Key и Value, которые можно использовать для доступа к ключу или значению, относящемуся к соответствующему элементу |
object Key {get;} | Получает прямой доступ к ключу |
object Value {get;} | Получает прямой доступ к значению |
В интерфейсе IComparer определен метод, который позволяет сравнивать два объекта:
int Compare (object v1, object v2)
Этот метод возвращает положительное число, если значение
v1 больше значения v2, отрицательное, если v1 меньше v2, и ноль, если сравниваемые значения равны. Этот интерфейс можно использовать для задания способа сортировки элементов коллекции.
Интерфейс IHashCodeProvider должен быть реализован коллекцией, если необходимо определить собственную версию метода GetHashCode(). Все объекты (для получения хеш-кода) наследуют метод Object.GetHashCode(), который используется по умолчанию. посредством реализации интерфейса IHashCodeProvider можно определить альтернативный метод.
-
3.2. Классы коллекций
Классы коллекций делятся на три основных категории: общего назначения, специализированные и ориентированные на побитовую организацию данных. Классы общего назначения можно использовать для хранения объектов любого типа. Битовые предназначены для хранения битовой информации. Коллекции специального назначения разрабатываются для обработки данных конкретного типа. В данной работе рассматриваются только классы коллекций общего назначения. Эти ые и ориентированные на побитовую организациюклассы перечислены в таблице:
Класс | Описание |
ArrayList | Динамический массив, т.е массив, который при необходимости может увеличивать свой размер |
HashTable | Хеш-таблица для пар ключ/значение |
Queue | Очередь |
SortedList | Отсортированный список пар ключ/значение |
Stack | Стек |
Класс ArrayList предназначен для поддержки динамических массивов, которые при необходимости могут увеличиваться или сокращаться. Объект этого класса представляет собой массив переменной длины, элементами которого являются объектные ссылки. Любой объект класса ArrayList создается с некоторым начальным размером. При превышении этого размера коллекция автоматически его увеличивает. В случае удаления объектов массив можно сократить.
Класс ArrayList реализует интерфейсы ICollection, IList, IEnumerable и ICloneable. В классе определены следующие конструкторы:
Прототип конструктора | Описание |
public ArrayList() | Создает пустой ArrayList-массив с начальной емкостью в 16 элементов |
public ArrayList (ICollection c) | Создает массив, который инициализируется элементами и емкостью коллекции c |
public ArrayList (int capacity) | Создает массив с заданной начальной емкостью |