
- •1. Цель работы
- •2. Сведения из теории
- •2.1. Интерфейсы коллекций
- •Void CopyTo(Array target, int startIdx)
- •IEnumerator GetEnumerator()
- •Int Compare (object v1, object v2)
- •2.2. Классы коллекций
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •3.2.1. Разработка класса точки
- •3.2.2. Обработчики событий
- •4. Варианты заданий для самостоятельной работы
Лабораторная работа №2. Разработка приложений с использованием коллекций
1. Цель работы
Изучить интерфейсы и классы коллекций библиотеки .NET Framework, основные свойства и методы этих классов, применяемые при работе с коллекциями.
2. Сведения из теории
2.1. Интерфейсы коллекций
В C# под коллекцией понимается группа объектов. Пространство имен System.Collections содержит множество интерфейсов и классов, которые определяют и реализуют коллекции различных типов (динамические массивы, стеки, очереди, словари, хеш-таблицы и т.п.).
Интерфейсы, которые поддерживают коллекции и их иерархия приведены на рисунке 2.1.
Рисунок 2.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 должен быть реализован в любом классе, если в нем предполагается поддержка нумераторов. В этом интерфейсе определен единственный метод: