* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Наборы
7 февраля 2009
Наборы предоставляют дополнительные возможности по управлению группами объектов. Набор (collection) — это специальный класс, объединяющий несколько объектов в группу и открывающий к ней доступ. Как и в массиве, доступ к члену набора осуществляется через его индекс, но в отличие от массива размеры набора разрешается динамически изменять, добавляя и удаляя его члены во время выпол- нения.
Примечание В этом разделе рассматриваются только типы наборов из пространства имен System. Collections. Технически возможно создать класс набора и без этих ти- пов, применяя некоторые интерфейсы, которые обычно реализуют в типах набо- ров. Подробнее об интерфейсах и их реализации рассказано в главе 4. Как правило, наборы применяют для управления группами элементов, динами- чески формируемых во время выполнения. Например, можно создать приложение для анализа группы объектов Customer, представляющих сведения о покупателях. Создание набора объектов Customer позволит анализировать отдельные объекты, перебирать их в цикле, а также добавлять новые и удалять устаревшие объекты по мере необходимости. Класс ArrayList Класс System. Collections.ArrayList предоставляет базовую функциональность цля ра- боты с наборами, достаточную для решения многих задач. Этот класс позволяет динамически добавлять и удалять элементы из простого списка. Для извлечения элемента необходимо указать его индекс в списке. Новые экземпляры класса Array- List создают так: Visual Basic .NET Dim myList As New System.Collections.ArrayList() Visual C# System.Collections.ArrayList myList = new System.Collections.ArrayList(); Метод Add К созданному экземпляру класса ArrayList можно добавлять новые элементы при помоши метода Add: Visual Basic .NET Dim myWidget As New Widget() myList.Add(myWidget) Visual C# Widget myWidget = new WidgetO; myList.Add(myWidget); Нумерация объектов-элементов набора ArrayList начинается с нуля, то есть пер- вый элемент списка получает индекс «О», второй — «1» и т.д. Свойство-индексатор Item Свойство Item набора позволяет извлечь из него элемент с заданным индексом. В Visual Basic .NET свойство Item считается свойством набора по умолчанию. Таким образом, при обращении к элементам набора можно опускать имя свойства Item, как при обращении к элементу массива. В Visual C# свойства наборов по умолча- нию называются индексаторами (indexer), поэтому вместо явного указания имени свойства Item в программах на С# необходимо применять ссылки на элементы мас- сива. Подробнее свойства по умолчанию и индексаторы обсуждаются на следую- щем занятии. Следующий пример демонстрирует оба способа получения элемента набора посредством свойства Item. Visual Basic .NET Dim myObject As Object myObject = rnyList(O) Следующая строка эквивалентна предыдущей. myObject = myList.Item(O) Visual C# object myObject; myObject = myListfO]; Все ссылочные типы, хранимые в наборах, имеют тип Object. Поэтому свойство Item всегда возвращает ссылку на Object, независимо от реального типа объекта, который находится в этом элементе. Если же нужно получить исходный тип, кото- рый был записан в набор, необходимо явно привести объект, возвращаемый свой- ством Item, к требуемому типу: Visual Basic .NET Dim myWidget As Widget ' Этот пример предполагает наличие набора объектов Widget. myWidget = CType(widgetCollection(0), Widget) Visual C# Widget myWidget; myWidget = (Widget)widgetCollection[0]; Методы Remove и RemoveAt Эти методы предназначены для удаления элементов из набора. Метод Remove при- нимает в качестве параметра ссылку на объект, удаляемый из набора: Visual Basic .NET Dim myWidget As New Widget() Dim myList As New System.Collections.ArrayListf) ' Добавить в набора объект Widget. myList.Add(myWidget) ' Удалить объект Widget из набора. myList.Remove(myWidget) Visual C# Widget myWidget = new Widget(); System.Collections.ArrayList myList = new System. Collections. ArrayListO; // Добавить объект Widget в набор. myList.Add(myWidget); // Удалить объект Widget из набора. myList.Remove(myWidget); Попытка удалить из набора объект, отсутствующий в нем, не вызывает ошибку и просто игнорируется. Метод RemoveAt позволяет удалить из набора элемент с заданным индексом, на- пример, так: Visual Basic .NET Dim myList As New System.Collections,ArrayListO ' Добавить в набор три объекта Widget. Dim X As Integer For X = 1 to 3 Dim aWidget As New Widget() myList.Add(aWidget) Next 1 Удалить объект Widget с индексом 1. myList.RernoveAt(l) Visual C# System.Collections.ArrayList myList = new System.Collections.ArrayList(); // Добавить в набор три объекта Widget, for (int x - 0; x < 3; x++) : Widget myWidget - new Widgetf); myList.Add(myWidciet); : // Удалить объект Widget с индексом 1. myList.RemoveAt(1); Заметьте: после удаления оставшиеся элементы набора нумеруются заново, что позволяет восстановить их последовательную нумерацию. В силу этих обстоятельств индекс элементов может изменяться. Свойство Count Свойство Count возвращает текущее число элементов набора. Поскольку нумера- ция элементов начинается с нуля, значение Count всегда на единицу больше верх- ней границы массива. Другие типы наборов из класса Collections В пространстве имен System. Collections есть и другие классы наборов, позволяющие упорядочивать объекты, объединяя их в группы. Эти классы предоставляют допол- нительные возможности и позволяют решать специфические задачи, недоступные классу ArrayList. Отдельные классы кратко описаны в таблице 3-6. Таблица 3-6. Члены класса System. Collections Имя Описание BitArray Представляет уплотненный массив однобитных элементов (принимающих значение 1 или 0) CollectionBase Основа для создания пользовательских классов наборов, предоставляет большинство функций, необходимых для обслуживания наборов Hashtable Набор пар «ключ — значение», упорядоченных по значению хеш-кода ключа Queue Набор объектов, организованный по принципу «первым вошел — первым вышел» Sortedlist Группа объектов, доступных через значение индекса или ключа Stack Набор объектов, организованный по принципу «первым вошел — последним вышел»