На этом шаге мы дадим общие сведения о коллекции и приведем пример ее использования.
Далее мы познакомимся с тем, как в языке C# реализуются коллекции (иногда их еще называют контейнерами). Вообще, под коллекцией подразумевают группу объектов. Такая группа объектов реализуется как некий объект определенного класса, содержащий в себе коллекцию объектов другого класса. Технически это можно реализовать с помощью класса, у которого есть поле, представляющее собой ссылку на массив объектов, формирующих коллекцию. То есть в прикладном плане мы могли бы сами без особых проблем описать подобный класс. То есть сама по себе возможность "спрятать" в одном объекте группу других объектов уникальной не является. Удобство и эффективность использования коллекций во многом связаны с наличием методов, облегчающих работу с группами объектов, содержащихся в коллекции. Другая важная особенность коллекций, выделяющая их на фоне обычных массивов, - возможность добавлять элементы в коллекцию и удалять элементы из коллекции.
В C# существуют классы для реализации самых разных коллекций. С некоторыми из них мы познакомимся поближе.
Коллекции могут быть самыми разными, но у всех них есть определенные общие характеристики. Такое "единство стандарта" поддерживается за счет реализации классами коллекций специальных интерфейсов. Интерфейсы, реализованные в классе коллекции, определяют, какими методами обладает коллекция. Одним из фундаментальных интерфейсов при работе с коллекциями является ICollection (из пространства имен System.Collections). Кроме этого интерфейса, можно упомянуть такие, как IComparer, IDictionary, IEnumerator, IList и INumerable. Например, интерфейс ICollection содержит объявление доступного только для чтения свойства Count, определяющего количество элементов коллекции. Метод CopyTo() предназначен для копирования содержимого коллекции в массив, переданный методу в качестве аргумента. Интерфейс IList содержит объявление таких методов, как
Существуют стандартные классы, реализующие перечисленные выше интерфейсы. Один из них - класс ArrayList. Класс ArrayList реализует интерфейсы ICollection, IList, IEnumerable и ICloneable. Этот класс предназначен для реализации динамических массивов, размер которых может меняться в процессе выполнения программы. Пример создания и использования коллекции на основе класса ArrayList представлен в примере ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace pr297_1 { // Главный класс: class Program { // Главный метод: static void Main() { // Целочисленная переменная: int n = 10; // Создание объекта коллекции (без элементов): ArrayList fibs = new ArrayList(); // Добавление элементов в коллекцию: fibs.Add(1); fibs.Add(1); for(int k = 2; k <= n;k++) { // Вычисление нового элемента и добавление // в коллекцию: fibs.Add((int)fibs[fibs.Count - 1] + (int)fibs[fibs.Count - 2]); } // Отображение содержимого коллекции: foreach(object obj in fibs) { Console.Write("|" + obj); } Console.WriteLine("|"); // Удаление элементов из коллекции: fibs.Remove(1); fibs.Remove(5); // Вставка элемента в начало коллекции: fibs.Insert(0, 100); // Обратный порядок элементов в коллекции: fibs.Reverse(); // Преобразование коллекции в массив: int[] nums = (int[])fibs.ToArray(typeof(int)); // Отображение содержимого массива: for(int k = 0; k < nums.Length; k++){ Console.Write("|" + nums[k]); } Console.WriteLine("|"); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой:
Рис.1. Результат работы приложения
В данном случае для работы с коллекциями мы подключаем пространство имен System.Collections. В главном методе программы объект коллекции fibs создается командой
ArrayList fibs = new ArrayList(); .
Для добавления элементов в коллекцию используем метод Add() (элемент добавляется в конец коллекции). То есть первые два элемента в коллекции - единицы. Затем запускается конструкция цикла, и за каждую итерацию цикла в коллекцию добавляется новый элемент. Предварительно этот элемент вычисляется как сумма двух предыдущих элементов. Для этого используется выражение (int)fibs[fibs.Count-1] + (int)fibs[fibs.Count-2].
При создании коллекции на основе класса ArrayList элементы коллекции реализуются на основе класса Object. Поэтому, с одной стороны, в коллекцию можно заносить элементы любого типа. С другой стороны, при считывании значений элементов из коллекции приходится выполнять явное приведение типа.
Для отображения элементов из коллекции использована конструкция цикла по коллекции foreach. При этом мы также учли, что элементы в коллекции сохраняются в виде объектных ссылок класса Object (в программе использован псевдоним object для выражения System.Object).
Для удаления элементов используется метод Remove(). Командой
fibs.Remove(1);
fibs.Remove(5);
fibs.Insert(0, 100);
fibs.Reverse();
Коллекцию можно преобразовать в массив (точнее, создать массив на основе коллекции). Для этого используют метод ToArray(). Пример использования этого метода дается командой
int[] nums = (int[])fibs.ToArray(typeof(int)); ,
На следующем шаге мы рассмотрим другие классы, используемые для создания коллекций.