Абстракции данных и их реализация классами коллекций языка C#
Покупка
Основная коллекция
Тематика:
Программирование на C и C++
Издательство:
Новосибирский государственный технический университет
Автор:
Зайцев Михаил Георгиевич
Год издания: 2019
Кол-во страниц: 86
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-7782-4060-5
Артикул: 778136.01.99
Учебное пособие предназначено для студентов, обучающихся по направлению 38.03.05 «Бизнес-информатика», дневной, заочной и дистанционной форм обучения дисциплинам «Объектно-ориентированный анализ и программирование». Материал учебного пособия охватывает часть материала, изучаемого по этой дисциплине. Излагаются вопросы спецификации и реализации абстрактных типов данных средствами классов коллекций языка C#, а также приведены указания к выполнению и варианты РГЗ. Примеры упражнений выполнены в среде Visual Studio.
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство науки и высшего образования Российской Федерации НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ М.Г. ЗАЙЦЕВ АБСТРАКЦИИ ДАННЫХ И ИХ РЕАЛИЗАЦИЯ КЛАССАМИ КОЛЛЕКЦИЙ ЯЗЫКА C# Утверждено Редакционно-издательским советом университета в качестве учебного пособия НОВОСИБИРСК 2019
УДК 004.415.22(075.8) З-177 Рецензенты: канд. техн. наук, доцент В.Г. Кобылянский, ст. преподаватель кафедры ТС и ВС СибГУТИ Л.Ф. Лебеденко Зайцев М.Г. З-177 Абстракции данных и их реализация классами коллекций языка C#: учебное пособие / М.Г. Зайцев. – Новосибирск: Изд-во НГТУ, 2019. – 86 с. ISBN 978-5-7782-4060-5 Учебное пособие предназначено для студентов, обучающихся по направлению 38.03.05 «Бизнес-информатика», дневной, заочной и дистанционной форм обучения дисциплинам «Объектно-ориентированный анализ и программирование». Материал учебного пособия охватывает часть материала, изучаемого по этой дисциплине. Излагаются вопросы спецификации и реализации абстрактных типов данных средствами классов коллекций языка C#, а также приведены указания к выполнению и варианты РГЗ. Примеры упражнений выполнены в среде Visual Studio. Работа подготовлена кафедрой теоретической и прикладной информатики УДК 004.415.22(075.8) ISBN 978-5-7782-4060-5 © Зайцев М.Г., 2019 © Новосибирский государственный технический университет, 2019
КОЛЛЕКЦИИ Введение в коллекции В языке C# есть массивы, которые хранят в себе наборы однотипных объектов, но работать с ними не всегда удобно. Массив хранит фиксированное количество объектов. В том случае, когда мы заранее не знаем, сколько нам потребуется объектов, намного удобнее применять коллекции. Коллекция – это класс или шаблон класса, экземпляры которого обеспечивают: хранение набора объектов, заданного типа и выполнение над ними операций, определенных в коллекции. Коллекции, включенные в библиотеки C#, реализуют стандартные структуры данных, например, стек, очередь, словарь, которые могут пригодиться для решения различных специальных задач. Большая часть классов коллекций содержится в пространствах имен System.Collections (нетипизированные классы коллекций), System.Collections.Generic (типизированные классы коллекций) и System.Collections.Specialized (специальные классы коллекций). Также для обеспечения параллельного выполнения задач и многопоточного доступа применяются классы коллекций из пространства имен System.Collections.Concurrent. Рассмотрим создание и применение двух коллекций: ArrayList – нетипизированная коллекция и List<T> – типизированная коллекция. ArrayList хранит экземпляры класса object, но поскольку этот класс – родоначальник всех классов C#, вы можете заносить в эту коллекцию экземпляры любого типа. Объект любого класса перед помещением в ArrayList неявно преобразуется к типу object. Поэтому при извлечении объект необходимо явно приводить к его исходному типу. Коллекция List<T> хранит экземпляры класса Т. Вместо параметра Т при описании переменной вы подставляете имя класса объектов, которые собираетесь хранить в списке. Пример работы с ArrayList и List<T> приведен ниже.
using System; using System.Collections; using System.Collections.Generic; namespace Collections { class Program { static void Main(string[] args) { // Необобщенная коллекция ArrayList ArrayList objectList = new ArrayList() { 1, 2, "string", 'c', 2.0f }; object obj = 45.8; objectList.Add(obj); objectList.Add("string2"); objectList.RemoveAt(0); // Удаление первого элемента foreach (object o in objectList) { Console.WriteLine(o);//Вывод элементов коллекции на монитор. } Console.WriteLine("Общее число элементов коллекции: " + objectList.Count); // Обобщенная коллекция List List<string> countries = new List<string>() { "Россия", "США", "Великобритания", "Китай" }; countries.Add("Франция"); countries.RemoveAt(1); // Удаление второго элемента foreach (string s in countries) { Console.WriteLine(s); //Вывод элементов коллекции на монитор. } Console.ReadLine(); } } } Здесь используются две коллекции: нетипизированная – ArrayList по имени objectList и типизированная – List<string> по имени countries. Большинство коллекций поддерживают добавление элементов. Например, в данном случае добавление производится методом Add, но для других коллекций название метода может быть другим. Также большинство коллекций реализуют удаление элементов (в данном примере производится с помощью метода RemoveAt).
С помощью свойства Count у коллекций можно посмотреть количество элементов. Так как коллекции реализуют интерфейс IEnumerable/IEnumerable <T>, то все они поддерживают перебор в цикле foreach. Конкретные методы и способы использования могут быть различны для разных классов коллекции, но общие принципы будут одни и те же для всех классов коллекций. Класс ArrayList Ниже приведено описание основных методов и свойств класса ArrayList, реализующего нетипизированную коллекцию. Этот класс описан в пространстве имен System.Collections и наследует от класса System.Object. Описание конструкторов, свойств и методов класса коллекции ArrayList приведены ниже в таблицах. Конструкторы Имя Описание ArrayList() Инициализирует новый экземпляр класса ArrayList, который является пустым и имеет начальную емкость по умолчанию. ArrayList(ICollection) Инициализирует новый экземпляр класса ArrayList, который содержит элементы, скопированные из указанной коллекции, и обладает начальной емкостью, равной количеству скопированных элементов. ArrayList(Int32) Инициализирует новый пустой экземпляр класса ArrayList с указанной начальной емкостью. Свойства Имя Описание Capacity Возвращает или задает число элементов, которое может содержать список ArrayList. Count Возвращает число элементов, содержащихся в ArrayList. IsFixedSize Получает значение, указывающее, имеет ли список ArrayList фиксированный размер. IsReadOnly Получает значение, указывающее, является ли объект ArrayList доступным только для чтения. Item[Int32] Возвращает или задает элемент по указанному индексу.
Методы Имя Описание Add(Object) Добавляет объект в конец очереди ArrayList. BinarySearch(Object) Выполняет поиск элемента по всему отсортированному списку ArrayList, используя компаратор по умолчанию, и возвращает индекс элемента, отсчитываемый от нуля. Clear() Удаляет все элементы из коллекции ArrayList. Contains(Object) Определяет, входит ли элемент в коллекцию ArrayList. CopyTo(Array) Копирует весь список ArrayList в совместимый одномерный массив Array, начиная с начального элемента целевого массива. CopyTo(Array, Int32) Копирует целый массив ArrayList в совместимый одномерный массив Array, начиная с заданного индекса целевого массива. CopyTo(Int32, Array, Int32, Int32) Копирует диапазон элементов из списка ArrayList в совместимый одномерный массив Array, начиная с указанного индекса целевого массива. Equals(Object) Определяет, равен ли заданный объект текущему объекту.(Наследуется от Object.) GetRange(Int32, Int32) Возвращает список ArrayList, представляющий подмножество элементов исходного списка ArrayList. GetType() Возвращает объект Type для текущего экземпляра. (Наследуется от Object.) IndexOf(Object) Осуществляет поиск указанного объекта Object и возвращает отсчитываемый от нуля индекс первого вхождения в коллекцию ArrayList. IndexOf(Object, Int32) Осуществляет поиск указанного объекта Object и возвращает отсчитываемый от нуля индекс первого вхождения в диапазоне элементов списка ArrayList, начиная с заданного индекса и до последнего элемента.
IndexOf(Object, Int32, Int32) Выполняет поиск указанного объекта Object и возвращает отсчитываемый от нуля индекс первого вхождения в диапазоне элементов списка ArrayList, который начинается с заданного индекса и содержит указанное число элементов. Insert(Int32, Object) Вставляет элемент в коллекцию ArrayList по указанному индексу. LastIndexOf(Object) Осуществляет поиск указанного объекта Object и возвращает отсчитываемый от нуля индекс последнего вхождения в коллекцию ArrayList. LastIndexOf(Object, Int32) Осуществляет поиск указанного объекта Object и возвращает отсчитываемый от нуля индекс последнего вхождения в диапазоне элементов списка ArrayList, начиная с первого элемента и заканчивая элементом с заданным индексом. LastIndexOf(Object, Int32, Int32) Выполняет поиск указанного объекта Object и возвращает отсчитываемый от нуля индекс последнего вхождения в диапазоне элементов списка ArrayList, содержащем указанное число элементов и заканчивающемся в позиции с указанным индексом. Remove(Object) Удаляет первое вхождение указанного объекта из коллекции ArrayList. RemoveAt(Int32) Удаляет элемент списка ArrayList с указанным индексом. RemoveRange(Int32, Int32) Удаляет диапазон элементов из списка ArrayList. Reverse() Изменяет порядок элементов во всем списке ArrayList на обратный. Reverse(Int32, Int32) Изменяет порядок элементов в указанном диапазоне. Sort() Сортирует элементы во всем списке ArrayList. Sort(IComparer) Сортирует элементы во всем списке ArrayList с помощью указанной функции сравнения.
Sort(Int32, Int32, IComparer) Сортирует элементы в диапазоне элементов списка ArrayList с помощью указанной функции сравнения. ToArray() Копирует элементы списка ArrayList в новый массив Object. ToArray(Type) Копирует элементы списка ArrayList в новый массив с элементами указанного типа. ToString() Возвращает строковое представление текущего объекта. (Наследуется от Object.) TrimToSize() Задает значение емкости, равное действительному количеству элементов в ArrayList. Класс ArrayList предназначен для хранения коллекции неоднородных объектов. Однако он не всегда обеспечивает наилучшую производительность. Для повышения производитльности вместо него можно использовать: для разнородных объектов коллекцию List<Object>; для однородных объектов коллекцию List<T> класса. Перед выполнением операции BinarySearch необходимо отсортировать ArrayList путем вызова метода Sort. Емкость ArrayList – количество элементов, которые ArrayList может содержать. При добавлении элементов к ArrayList емкость автоматически увеличивается должным образом посредством перераспределения памяти. Емкость может быть уменьшена путем вызова TrimToSize или заданием значения свойству Capacity явно. Доступ к элементам в этой коллекции осуществляется с помощью целочисленного индекса. Индексы в этой коллекции отсчитываются от нуля. ArrayList принимает в коллекцию значение null как допустимое значение. Он также допускает наличие повторяющихся элементов. Использование многомерных массивов в качестве элементов в ArrayList не поддерживается. В следующем примере кода показано, как создать и инициализировать ArrayList и отображение его значения.
using System; using System.Collections; namespace ConsoleArrayList { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); // Заносим в список объект типа double. list.Add(2.3); // заносим в список объект типа int. list.Add(55); // Заносим в список символ. list.Add('Z'); // Заносим в список строковый массив. list.AddRange(new string[] { "Hello", "world" }); Console.WriteLine("Список после занесения элементов:"); // Перебор значений. foreach (object o in list) { Console.WriteLine(o); } // Удаляем первый элемент. list.RemoveAt(0); // Удаляем первый элемент. list.Remove('Z'); // переворачиваем список. list.Reverse(); // Получение элемента по индексу. Console.WriteLine(list[0]); // Получение типа элемента. Console.WriteLine(list[0].GetType().ToString()); Console.WriteLine("Список после модификации:"); // Перебор значений. for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } Console.ReadLine(); } } }