// Создание ArrayList и заполнение исходными значениями.
ArrayList carArList = new ArrayList();
carArList.AddRange(new Car[] {new Car("Fred", 90
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("Третья"
// Первая машина в очереди.
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);}
}