Здесь для добавления в коллекцию 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("Третья"
// Первая машина в очереди.
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 для обработки. Обратите внимание на то, что при попытке удаления элемента из пустой очереди среда выполнения генерирует исключение.
Работа с типом Stack
Тип System.Collections.Stack представляет коллекцию, в которой элементы размещаются по правилу "последним прибыл – первым обслужен". Как и следует ожидать, Stack определяет члены с именами Push и Pop (для добавления элементов в стек и удаления их из стека). В следующем примере стека используется стандартный тип System.String.
static void Main(string[] args) {
…
Stack stringStack = new Stack;
stringStack.Push("Первый");
stringStack.Push("Второй");
stringStack.Push("Третий");
// Смотрим на первый элемент, удаляем его и смотрим снова.
Console.WriteLine("Первый элемент: {0}", stringStack.Peek);
Console.WriteLine("Удален {0}", stringStack.Pop);
Console.WriteLine("Первый элемент: {0}", stringStack.Peek);
Console.WriteLine("Удален {0}", stringStack.Pop);