440 likes | 648 Vues
Высокоуровневые методы информатики и программирования Лекция 15 Коллекции. Коллекции. Коллекции – классы, объекты которых могут хранить ссылки на объекты других классов (контейнеры). Куча. Коллекция. Интерфейсы для работы с коллекциями. Интерфейсы классов коллекций.
E N D
Высокоуровневые методы информатики и программированияЛекция 15Коллекции
Коллекции Коллекции – классы, объекты которых могут хранить ссылки на объекты других классов (контейнеры) Куча Коллекция
Интерфейсы для работы с коллекциями
Интерфейсы классов коллекций • IEnumerable - Составляет список объектов классов коллекций с помощью оператора foreach • IComparer - Сравниваетдваобъектаклассовколлекцийприихсортировке; • ICollection - Реализуетсявсемиклассамиколлекцийдляобеспечениядоступа к методуСоруТо(), GetEnumerator() и свойствоCount; • IList - Используется объектами классов коллекций, индексируемыми как массив. • IDictionary - Используется классами коллекций,осуществляющими доступ по ключу или значению, таких как Hashtableи SortedList. • IDictionaryEnumerator - Позволяетпросмотреть (с помощьюоператораforeach) объектыклассовколлекций, поддерживающихинтерфейсIDictionary
Интерфейс IEnumerable interface IEnumerable { IEnumerator GetEnumerator(); } interface IEnumerator { publicbool MoveNext(); // i++ publicvoid Reset(); // i=0; publicоbject Current {get;}); //property }
Коллекции • System.Array - массивы – простейший тип коллекций • фиксированный размер • однотипные объекты • System.Collections. • ArrayList – неограниченный список элементов. • Queue – порядок элементов FIFO • Stack – порядок элементов LIFO • Hashtable – словарь (ключ - значение), оптимизирован для быстрого поиска значний.
Коллекции в .NET System.Collections Нетипизированные коллекции Специализированные коллекции System.Collections.Generic Шаблонные коллекции
Основные элементы интерфейса ICollection
Основные элементы интерфейса IDictionary • Описывает не обобщенную коллекцию пар (ключ, значение) • Основные методы: • Add()– добавляет элемент с заданным ключем и значением; • Clear()– удаляет все элементы из словаря; • Contains () – проверяетсодержит ли словарь заданный элемент; • CopyTo()– копирует элементы ICollectionв массив начиная с заданного индекса массива (наследуется от ICollection); • GetEnumerator()– перегруженный метод для получения объекта Enumerator. • Remove () – удаление всех элементов с заданным ключем из объекта IDictionary.
Типы нетипизированных коллекций • ArrayList– простая коллекция (наследуется от интерфейса IList), которая может хранить объекты любого типа. Экземпляры ArrayList могут хранить произвольное количество объектов, при необходимости, они увеличивают объем используемой памяти. • Queue – коллекция, которая поддерживает следующий порядок работы с объектами: «первым пришел, первым вышел» (first-in, first-out – FIFO). Можно использовать Queue на сервере обработки сообщений, для временного хранения сообщений перед обработкой, или для хранения информации о клиентах, которые должны обрабатываться в порядке «Первым – пришел, первым – ушел». • Stack– коллекция, которая поддерживает следующий порядок работы с объектами: «Последним пришел – первым ушел» (last-in, first-out – LIFO). Можно использовать Stack для хранения наиболее новых изменений, чтобы можно было их отменить.
Класс ArrayList • Реализует интерфейсы IList, ICollection, IEnumerable, ICloneable, используя массив, размер которого динамически меняется по необходимости. ArrayList arl = new ArrayList( ); • Свойства • Сount – количество элементов • Capacity – текущий объем списка • Item – получение элемента по индексу (indexer[ i ] – операция) • Методы • Add( ) – добавить объект • Clear( ) – очистить • Sort( ) – сортировать • …
Пример работы ArrayList al = new ArrayList(); al.Add("Привет"); al.Add("Мир"); al.Add(5); al.Add(new FileStream("delemete", FileMode.Create)); Console.WriteLine("Коллекция содержит " + al.Count + " элемента:"); foreach (object s in al) Console.Write(s.ToString() + " "); • Результат Коллекция содержит 4 элемента: Привет Мир 5 System.IO.FileStream
ArrayList al = new ArrayList(); ArrayList al = new ArrayList() {"Привет", "Мир", "это", "проверка"}; al.Remove("это"); al.Insert(1, "Наш"); al.Sort(); foreach (object s in al) Console.Write(s.ToString() + " "); • Результатом работы будет следующая строка: Мир Наш Привет проверка
Метод преобразования коллекции к типу OfType<T>() • В не типизированных коллекциях могут храниться данные любого типа. • Для применения LINQ нужно выбрать из них только те, которые имеют определенный тип (преобразовать в типизированную коллекцию) • Метод OfType<T>() выбирает из нетипизированной коллекции только объекты заданного типа и преобразует их к типу IEnumerable<TResult>. • Например: // ExtracttheintsfromtheArrayList. ArrayListmyStuff = newArrayList(); myStuff.AddRange(newobject[] { 10, 400, 8, false, newCar(), "stringdata" }); IEnumerable<int> myInts = myStuff.OfType<int>(); // Printsout 10, 400, and 8. foreach (intiinmyInts) { Console.WriteLine("Intvalue: {0}", i); }
Класс очередей (Queue) • Очередь (queue) - это класс коллекций, организованный по принципу FIFO (первым вошел - первым вышел). Классическая аналогия - очередь в кассу за билетами. Первый человек, стоящий в очереди, первый и выйдет из нее, когда купит билет. • Очередь удачно подходит для управления ограниченными ресурсами.
Свойства и методы очереди • Свойство • Count - Открытое свойство, позволяющее узнать текущее количествоэлементов очереди • Методы • Enqueue() - Добавляет объект в конец объекта Queue • Dequeue() - Возвращает объект,стоящий в начале объекта Queue, и удаляет его из очереди • Peek() - Возвращает объект, стоящий в начале объекта Queue, не удаляя его • Contains () - Выясняет, находится ли данный элемент в объекте Queue • Clear() - Удаляет все элементы из объекта Queue
Queue q = new Queue(); q.Enqueue("Привет"); q.Enqueue("мир"); q.Enqueue("просто тестирование"); Console.WriteLine("Использование Queue:"); for (inti = 1; i <= 3; i++) Console.WriteLine (q.Dequeue().ToString()); • Результат: Использование Queue: Привет мир просто тестирование
Класс Stack (Стек) • это класс коллекции, организованный по принципу LIFO (последним вошел- первым вышел). • Аналогией может служить стопка подносов в столовой самообслуживания (или, например, столбик из монет). Поднос, положенный в стопку последним, будет взят оттуда первым. • Основными методами для работы со стеком являются Push ( ) (добавление элемента) и Рор() (удаление). • Кроме того, класс Stack предоставляет метод Peek(), аналогичный одноименному методу класса Queue.
Свойства и методы стека • Свойство • int Count – количество элементов стека • Методы • void Push() – Помещает объект на вершину объекта Stack • object Pop() -Возвращает объект, находящийся на вершине объекта Stack, и удаляет его из стека • object Peek() – Возвращает объект, находящийся на вершине объекта Stack, не удаляя его • void Clear() – убрать все объекты • bool Contains(a) – проверка есть элемент
Пример работы со стеком Stack s = new Stack(); s.Push("Привет"); s.Push("мир"); s.Push("просто тестирование"); Console.WriteLine("\nИспользование Stack:"); for (inti = 0; i < 3; i++) Console.WriteLine (s.Pop().ToString()); • Результат: Stack demonstration: просто тестирование мир Привет
Словари • Классы словарей (dictionaries) задают соответствие между ключами (key) и значениями (value). Например, можно связать идентификатор сотрудника (например, табельный номер) с объектом класса, описывающего сотрудника номер. • Значение словаря можно найти по значению ключа: • значение = словарь [ключ]; Куча Ключ Ссылка Словарь
Типы нетипизированных словарей • Классы словарей (dictionaries) задают соответствие между ключами (key) и значениями (value). Например, можно связать идентификатор сотрудника (например, табельный номер) с объектом класса, описывающего сотрудника номер. В FCL включены следующие основные классы словарей: • Hashtable – словарь (хешированная таблица) пар (имя, значение), которые могут быть получены по имени или индексу; • SortedList – словарь, который автоматически сортируется по ключу; • StringDictionary – словарь Hashtable в котором пары имя/значение могут быть только строками string.
Отсортированный список SortedList • Поддерживает интерфейсы IDictionary, ICollection, IEnumerable, ICloneable • Представляет собой коллекцию пар (ключ, значение), которые сортируются по ключу и доступны • по ключу [ключ] и • индексу [i].
SortedList sl = new SortedList(); sl.Add("Stack", "Коллекция объектов типа LIFO."); sl.Add("Queue", "Коллекция объектов типа FIFO."); sl.Add("SortedList", "Коллекция пар ключ/значение."); foreach (DictionaryEntry de in sl) Console.WriteLine(de.Value); string s = (string)sl["Queue"]; // s = "Коллекция объектов типа FIFO.«
Класс Hashtable (Хеш-таблица) • это словарь, оптимизированный для максимально быстрого получения информации. • Хранение пар (ключ, значение) организовано в соответствии с хэш кодом ключа. • В объекте Hashtableкаждое значение хранится в блоках. Блоки пронумерованы, чем напоминают элементы массива. • Поскольку ключ может и не быть целым числом, нужен способ преобразования ключа (например строки “Иванов”) в номер блока. • Каждый ключ обязан предоставить метод GetHashCode(), выполняющий это действие.
Хеш-код (продолжение) • Стандартная реализация метода GetHashCode() для строки сводится к тому, что Unicode-коды всех символов строки складываются, а затем с помощью деления по модулю получается значение от 0 до N, где N - количество блоков в хеш-таблице. Писать такой метод для типа stringне надо, так как среда CLR предоставляет его по умолчанию. • Когда в объект Hashtable вставляются значения, он вызывает метод GetHashCode() для каждого указанного ключа. Метод возвращает целочисленное значение, идентифицирующее блок, в который помещено значение. • Не исключена ситуация, когда для нескольких ключей будетвозвращен один номер блока. Это называется конфликтом (collision).Существует ряд способов разрешения конфликтов. Самым распространенным подходом, к тому же принятым в CLR, является ведение упорядоченного списка значений в каждом блоке.
Свойства и методы Hashtable • Свойства • Count – текущее число элементов • [ ] – индексатор • Методы • Clear() - Удаляет все элементы из объекта Hashtable • Add(object k, object v) - Добавляет запись с указанной парой ключ/значение • Remove() - Удаляет запись с указанным ключом • ContainsKey () - проверить наличие заданного ключа. • ContainsValue () - проверить наличие заданного значения.
Универсальные классы (Generic classes)
Обобщения (generics) • Под обобщением (универсальностью, generality) понимается способность типа объявлять используемые им другие типы как параметры. • Класс с параметрами, задающими типы, называется обобщенным или универсальным классом (generic class). • Обобщенными могут быть: • классы • методы • делегаты • интерфейсы
Обобщенные классы(Generic Classes) class MyClass<T1, ... Tn> {...} • Пример обобщенного класса: public class Point<T> { //координаты точки, тип которых задан параметром T x, y; // другие свойства и методы структуры . . . } • При описании переменной данного типа нужно задать конкретный используемый тип. • Например: Point<int> pt; pt = new Point<int> ();
Пример обобщенного метода: class Change { static public void Swap<T>(ref T x1, ref T x2) { T temp; temp = x1; x1 = x2; x2 = temp; } }
Использование обобщенного метода public void TestSwap() { int x1 = 5, x2 = 7; Change.Swap<int>(ref x1, ref x2); erson pers1 = new Person("Савлов", 25, 1500); Person pers2 = new Person("Павлов", 35, 2100); Change.Swap<Person>(ref pers1, ref pers2); }
Стандартные обобщенные делегаты • В библиотеке FCL описаны стандартные обобщенные делегаты, которые активно используются в методах классов библиотеки: • System.Action() – принимает значение (или значения) и ничего не возвращает; public delegate void Action<T>( T obj ) • System.Comparison() – принимает два параметра и возвращает целое значение (< 0: x < y; 0: x == y; > 0: x > y) public delegate int Comparison<T>( T x, T y ) • System.Converter() – преобразование объекта из одного типа в другой public delegate TOutput Converter<TInput, Toutput>( TInput input ) • System.EventHandler – обработчик событий public delegate void EventHandler<TEventArgs> ( Object sender, TEventArgs e ) where TEventArgs : EventArgs • System.Func() – принимает значение (или значения) и возвращает результат public delegate TResultFunc<T, TResult>( T arg ) • System.Predicate() – принимает значение и возвращает bool public delegate bool Predicate<T>( T obj )
Стандартные обобщенные интерфейсы • ICollection<T> • IComparer<T> • IDictionary<TKey, TValue> • IEnumerable<T> • IEnumerator<T> • IList<T>
Стандартные пространства имен • System – содержит основные базовые классы; • System.Collections – содержит интерфейсы и классы, которые описывают разные типы коллекций и словарей (не обобщенные). • System.Collections.Generic содержит интерфейсы и классы, которые описывают обобщенные коллекции и словари, которые позволяют пользователям создавать строго типизированные коллекции, предоставляющие лучшую безопасность работы с типами и лучшую производительность, чем не обобщенные коллекции; • System.Linqсодержит классы и интерфейсы, которые поддерживают интегрированный в язык C# язык запросов - Language-Integrated Query (LINQ). • System.Textсодержит классы представляющие методы кодировки символов ASCII, Unicode, UTF-7 и UTF-8; абстрактные базовые классы для конвертирования наборов символов в набор байтов; и вспомогательный класс для манипулирования и форматирования String объектов без создания промежуточных экземпляров типа String.
Обобщенные коллекции из System.Collections.Generic • List<тип>- список элементов переменного размера; • Queue<тип> – порядок элементов FIFO; • Stack<тип> – порядок элементов LIFO; • LinkedList<тип>- двухсвязный список; • Dictionary<TKey, TValue> (dictionary– коллекция, которая ассоциирует ключ (key)со значением (value))
Соответствие между обобщенными классами и их обычными двойниками
Пример использования Stack<Point> sp; sp = new Stack<Point>(); sp.Push(p); Point[] pa; pa = sp.ToArray();
public class Person : IComparable { string firstName, lastName; public intCompareTo(object obj) { Person otherPerson = (Person)obj; if (this.lastName != otherPerson.lastName) return this.lastName.CompareTo(otherPerson.lastName); else return this.firstName.CompareTo(otherPerson.firstName); } public Person(string _firstName, string _lastName){ firstName = _firstName; lastName = _lastName; } override public string ToString() { return firstName + " " + lastName; } }
List<Person> group = new List<Person>(); group.Add(new Person("Григорий", "Дубина")); group.Add(new Person("Иван", "Ходырев")); group.Add(new Person("Александр", "Луценко")); group.Sort(); foreach (Person p in group) Console.Write(p.ToString() + ";");
SortedList<string, int> sl = new SortedList<string, int>(); sl.Add("One", 1); sl.Add("Two", 2); sl.Add("Three", 3); foreach (inti in sl.Values) Console.Write(i.ToString() + " "); int n = sl[“Two”]; // значение 2 • Результат выполнения примера: 1 3 2
Словарь Dictionary <TKey, Tvalue> • Словарь (dictionary) - это класс коллекции, связывающий ключ созначением. • По такому же принципу построены толковые словари, например словарь Вебстера связывает слово (ключ) с его толкованием(значение).
Свойства и методы IDictionary • Свойство • Item – получить или записать элемент • Keys – получить ICollectionвсех ключей • Values - получить ICollectionвсех значений • Методы • Add() – добавить ключ и значение к словарю; • Clear() – удалить все ключи и значения из словаря; • Remove () – удалить значение с указанным ключем; • boolContainsKey(key) – определить есть ли в словаре указанный ключ; • boolContainsValue(value) - определить есть ли в словаре указанное значение; • boolTryGetValue(key, out value) - получить значение связанное с заданным ключом.