Чтение онлайн

ЖАНРЫ

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю

Шрифт:

Таблица 7.3. Классы System.Collections

Класс Описание Реализуемые интерфейсы
ArrayList Представляет динамически изменяемый по размерам массив объектов IList, ICollection, IEnumerable, ICloneable
Hashtable Представляет коллекцию объектов, идентифицируемых по числовому ключу. Пользовательские типы, хранимые в Hashtable, должны обязательно переопределять System.Object.GetHashCode IDictionary, ICollection, IEnumerable, ICloneable
Queue Представляет
стандартную очередь FIFO (first-in, first-out – первым прибыл, первым обслужен)
ICollection, ICloneable, IEnumerable
SortedList Подобен словарю, но здесь элементы могут быть также доступны по позиции (например, по индексу) IDictionary, ICollection, IEnumerable, ICloneable
Stack Очередь LIFO (last-in, first-out – последним прибыл, первым обслужен), обеспечивающая функциональные возможности стека ICollection, ICloneable, IEnumerable

Вдобавок к этим ключевым типам в System.Collections определяются некоторые менее значительные (в смысле частоты использования) "игроки", такие как BitArray, CaseInsensitiveComparer и CaseInsensitiveHashCodeProvider. Кроме того, это пространство имен определяет небольшой набор абстрактных базовых классов (CollectionBase, ReadOnlyCollectionBase и DictionaryBase), которые могут использоваться для построения строго типизованных контейнеров.

Экспериментируя с типами System.Collections, вы обнаружите, что все они "стремятся" использовать общие функциональные возможности (в этом и заключается суть программирования на основе интерфейсов). Поэтому вместо описания всех членов каждого класса коллекции задачей нашего обсуждения будет демонстрация возможностей взаимодействия с тремя главными типами коллекций - ArrayList. Queue and Stack. Освоив функциональные возможности этих типов, вы без особого труда сможете прийти к пониманию и остальных классов коллекций (особенно если учесть что в файлах справки предлагается исчерпывающая документация для каждого из типов).

Работа с типом ArrayList

Тип ArrayList непременно станет для вас наиболее часто используемым типом пространства имей System.Collections, поскольку он позволяет динамически переопределять размеры содержимого. Для иллюстрации базовых возможностей этого типа предлагаем вам рассмотреть следующий программный код, в котором ArrayList используется для манипуляций с набором объектов Car.

static void Main(string[] args) {

 // Создание ArrayList и заполнение исходными значениями.

 ArrayList carArList = new ArrayList;

 carArList.AddRange(new Car[] {new Car("Fred", 90, 10), new Car("Mary", 100, 50), new Car("MB", 190, 11)});

 Console.WriteLine("\nЭлементов в carArList: {0}", carArList.Count);

 // Печать текущих значений.

 foreach(Car с in carArList) Console.WriteLine("Имя автомобиля: {0}", c.petName);

 // Вставка нового элемента.

 Console.WriteLine("\n-›Добавление нового Car.");

 carArList.Insert(2, new Car("TheNewCar", 0, 12));

 Console.WriteLine("Элементов в carArList: {0}", carArList.Count);

 // Получение массива объектов из ArrayList и снова печать.

 object[] arrayOfCars = carArList.ToArray;

 for (int i = 0; i ‹ arrayOfCar.Length; i++) {

Console.WriteLine("Имя автомобиля: {0}", ((Car) arrayOfCars[i]).petName);

 }

}

Здесь для добавления в коллекцию ArrayList

набора типов Car используется метод AddRange (который, по сути, заменяет n-кратный вызов метода Add). После вывода информации о числе элементов в коллекции (и после цикла по всем элементам для получения имен) вызывается метод Insert. Как видите, Insert позволяет осуществить вставку нового элемента в заданную позицию ArrayList. Обратите внимание на вызов метода ToArray, который возвращает общий массив типов System.Object на основе содержимого оригинального ArrayList. На рис. 7.13 показан соответствующий вывод.

Рис. 7.13. Забавы с System.Collections.ArrayList

Работа с типом Queue

Тип Queue (очередь) – это контейнер, гарантирующий размещение элементов по правилу "первым прибыл – первым обслужен". К сожалению, люди сталкиваются с очередями повсеместно: очереди в банке, кинотеатре, по утрам к автомату, продающему кофе, и т.д. При моделировании сценариев, в которых элементы обрабатываются по правилу очереди, на помощь приходит System.Collections.Queue. Вдобавок к функциональным возможностям, обеспечиваемым поддерживаемыми интерфейсами, Queue определяет ряд членов, описанных в табл. 7.4.

Таблица 7.4. Члены типа Queue

Член Описание
Dequeue Возвращает объект, находящийся в начале Queue, с одновременным его удалением
Enqueue Добавляет объект в конец Queue
Peek Возвращает объект, находящийся в начале Queue, без его удаления 

Чтобы проиллюстрировать возможности этих методов, снова используем нашу автомобильную тему и построим объект Queue, моделирующий очередь автомобилей перед въездом на мойку. Во-первых, предположим, что у нас есть следующий вспомогательный статический метод.

public static void WashCar(Car с) {

 Console.WriteLine("Моется {0}", с.petName);

}

Теперь рассмотрим следующий программный код.

static void Main(string[] args) {

 …

 // Создание очереди с тремя элементами.

 Queue carWashQ = new Queue;

 carWashQ.Enqueue(new Car ("Первая", 0, 1));

 carWashQ.Enqueue(new Car("Вторая", 0, 2));

 carWashQ.Enqueue(new Car("Третья", 0, 3));

 // Первая машина в очереди.

 Console.WriteLine("Первой в очереди является {0}", ((Сar)сarWashQ.Peek).petName);

 // Удаление всех элементов из очереди.

 WashCar((Car)carWashQ.Dequeue);

 WashCar((Car)carWashQ.Dequeue);

 WashCar((Car)carWashQ.Dequeue);

 // Попытаемся удалить снова?

 try {WashCar((Car)carWashQ.Dequeue);}

 catch(Exception е) { Console.WriteLine("Ошибка: {0}", e.Message);}

}

Здесь в тип Queue с помощью метода Enqueue вставляются три элемента. Вызов Реек позволяет проверить, (но не удалить) первый элемент в текущем состоянии Queue, и таким элементом в данном случае является машина с именем Первая. Наконец, с помощью Dequeue элемент из очереди удаляется и посылается во вспомогательную функцию WashСar для обработки. Обратите внимание на то, что при попытке удаления элемента из пустой очереди среда выполнения генерирует исключение.

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