КоллекцииИтераторы Типы, допускающие неопределенное значение Обработка исключений Лекция 5.

Презентация:



Advertisements
Похожие презентации
Коллекции Итераторы Лекция 6. Коллекции Итераторы.
Advertisements

Коллекции классов Лекция 12. С помощью коллекций вместо создания структур данных программист использует готовые структуры данных, не заботясь об их реализации.
Типы, допускающие неопределенное значение Работа со строками Обработка исключений Лекция 9.
Обобщения ( шаблоны ) Лекция 5. Тип, метод или интерфейс параметризованный другим типом Обобщенный тип Тип ( класс, структура ), который параметризован.
АССОЦИАТИВНЫЕ КОЛЛЕКЦИИ Лекция 6 1. Отличие от последовательных 2 В последовательной коллекции каждый элемент ассоциируется с номером, начиная с 0. В.
Обобщения ( generics) Обобщения – это классы, структуры, интерфейсы и методы, в которых некоторые типы сами являются параметрами. Эти типы перечисляются.
Высокоуровневые методы информатики и программирования Лекция 15 Коллекции.
ИТЕРАТОРЫ И LINQ Лекция 1. Интерфейс IEnumerable и IEnumerator Любая коллекция реализует интерфейс IEnumerable. public interface IEnumerable : IEnumerable.
Интерфейсы Обобщения ( шаблоны ) Лекция 4. Интерфейсы Обобщения.
Java : массивы и коллекции. Массивы Массивы простых типов: int []a = new int[10]; int []b = new int[]{ 0, 1, 2, 3, 4, 5 }; Массивы ссылочных типов (reference.
Ассоциативные списки Поиск данных происходит не по индексу или положению объекта, а по его ассоциативной связи: public interface Map { // Доступ к объектам.
1 ©Павловская Т.А. (СПбГУ ИТМО) Структуры данных Контейнерные классы Работа с файлами.
Коллекции Во многих приложениях требуется создавать группы связанных объектов и управлять этими группами. Существует два способа группировки объектов:
Интерфейсы Лекция 4. Реализуйте очередь в виде списка, содержащую комплексные числа Реализуйте методы void Enqueue(Complex с ) – помещает число в очередь.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
1 Лекция 5 Абстрактные структуры данных. 2 Таблицы Таблица – это набор элементов, содержащих ключ – отличительный признак для поиска элементов, и тело.
Списки Лекция 10. Списки Список – структура данных, представляющая собой конечную последовательность элементов. Элемент списка: Данные Связь.
Реализация списков:динамические структуры ListList clasclas структура одного элемента type LIST = celltype; celltype = record element: eltype; next: LIST.
Способы передачи параметров Типы, допускающие неопределенное значение Работа со строками Лекция 3.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Транксрипт:

КоллекцииИтераторы Типы, допускающие неопределенное значение Обработка исключений Лекция 5

Коллекции Итераторы Типы, допускающие неопределенное значение Обработка исключений

Коллекции Итераторы Типы, допускающие неопределенное значение Обработка исключений

Коллекция Класс ( объект ), основное назначение которого – содержать в себе другие объекты по определенной дисциплине Примеры коллекций Массив, динамический массив Список, стек, очередь Дерево, множество, словарь ( хэш - таблица )

Основные пространства имен : System.Collections Нетипизированные коллекции Специализированные коллекции ArrayList, Hashtable и др. System.Collections.Specialized Специализированные коллекции System.Collections.Generic Обобщенные коллекции Список, очередь, словарь, стек System.Collections.ObjectModel Базовые реализации для собственных коллекция Специальные обобщенные коллекции до.NET 2 с.NET 2

Не типизированные коллекции : Не типизированные коллекции : ArrayList ArrayList – Массив object переменной длинны HashTable HashTable – Таблица пар ключ / значение, основанная на хранении хэш - кода ключа BitArray BitArray - Компактный массив битовых значений Stack Stack – Стек object Queue Queue – Очередь object SortedList, SortedList,- Сортированный по ключам словарь Практически не используются, поскольку есть обобщенные версии ( появились в.NET 2) Практически не используются, поскольку есть обобщенные версии ( появились в.NET 2)

Старые специализированные коллекции : Старые специализированные коллекции : ListDictionary ListDictionary – не типизированный словарь пар ключ / значение, ориентированный на хранение до 10 значений HybridDictionary HybridDictionary– не типизированный словарь пар ключ / значение, который до 10 значений хранит данные как ListDictionary, а более – преобразуется в HashTable OrderedDictionary OrderedDictionary- словарь, позволяющий индексировать значения по номеру StringCollection StringCollection– представляет собой коллекцию строк StringDictionary StringDictionary– словарь, где и ключ и значение - string BitVector32 BitVector32– структура для компактного хранения 32 bool значений. Практически не используются, поскольку есть обобщенные версии ( появились в.NET 2) Практически не используются, поскольку есть обобщенные версии ( появились в.NET 2)

Обобщенный коллекции : Обобщенный коллекции : List List - Список Переменной длинны LinkedList LinkedList - Двунаправленный связанный список переменной длинны SortedSet SortedSet - Отсортированный список Stack Stack - Стек Queue Queue - Очередь Dictionary Dictionary - Словарь SortedList SortedDictionary SortedList и SortedDictionary - Сортированный по ключам словарь HashSet HashSet - Множество (c.NET 3.5) SortedSet SortedSet - Сортированное множество (c.NET 4)

Содержит базовые классы для создания своих коллекций Collection Collection KeyedCollection KeyedCollection ObservableCollection Тип ObservableCollection - динамическая обобщенная коллекция, которая генерирует события при изменении коллекции ( добавлении, удалении элемента или при обновлении всего списка ) Важное применение - WPF Коллекции обертки только для чтения ReadOnlyObservableCollection ReadOnlyObservableCollection ReadOnlyCollection ReadOnlyCollection

Обобщенные vs. Необобщенные Обобщенные коллекции – контроль типов во время компиляции, необобщенные – контроля типов нет или во осуществляется во время выполнения В обобщенных коллекциях не нужно использовать boxing/unboxing при использовании типов - значений Обобщенные коллекции обладают более высокой производительностью Не обобщенные коллекции используются редко ( исключение – унаследованный код )

Список Динамически изменяет размер Обладает возможностью доступа по индексу Позволяет осуществлять поиск и сортировку Создание List list1 = new List (); List list2 = new List (10); List strList = new List () { один, два }; List complexList = new List () { new Complex() {Re =5, Im =7}, new Complex() {Re =3, Im =1}, }; Добавление Add(T item), AddRange( IEnumerable collection) Элемента ( ов ) ( в конец ) –Add(T item), AddRange( IEnumerable collection) list1.Add(5); list2.AddRange(list1); Insert(int index, T item), InsertRange(int index, IEnumerable collection) элемента ( ов ) в произвольное место Insert(int index, T item), InsertRange(int index, IEnumerable collection) Удаление Remove(T item) элемента Remove(T item) complexList.Remove(complex2); RemoveAt(int index), RemoveRange(int index, int count) Элемента ( ов 0 по индексу RemoveAt(int index), RemoveRange(int index, int count) Clear() Всех элементов Clear()

[int index] Доступ к элементу по индексу [int index] int j = l[3]; Count Количество элементов - свойство Count int k = l.Count; Sort() Сортировка элементов Sort() list1.Sort(); T[] ToArray() Преобразование в массив T[] ToArray() int[] arr = list1.ToArray(); Поиск bool Contains(T item) bool Contains(T item) – проверка – содержится ли элемент в списке bool Exists(Predicate match) bool Exists(Predicate match) – проверка – содержится ли элемент удовлетворяющий условию T Find( Predicate match) T Find( Predicate match)– Поиск первого элемента, удовлетворяющего условию int IndexOf( T item ) int IndexOf( T item ) – возвращает индекс элемента

Работа со списком. Сортировка комплексных чисел

Обобщенный стек Last In First Out (LIFO). Последним вошёл, первым вышел Динамически изменяет размер Создание Stack s = new Stack (); Push() Добавление элемента Push() s.Push(3); T Pop(). Clear() Удаление элемента T Pop(). Очистка всего стека Clear() int k = s.Pop(); T Peek() Просмотр элемента в вершине стека T Peek() int k = s. Peek(); Count Количество элементов - свойство Count if (s.Count == 0) … bool Contains(T item) bool Contains(T item) – проверка, содержится ли данный элемент в стеке T[] ToArray() Преобразование в массив T[] ToArray() int[] k = s. ToArray();

Обобщенная очередь first-in, first-out (FIFO). Первым вошел, первым вышел динамически изменяет размер Создание Queue q = new Queue (); Enqueue(T item ) Добавление элемента Enqueue(T item ) q.Enqueue(new Complex(4,5)); T Dequeue(). Clear() Удаление элемента T Dequeue(). Очистка всей очереди Clear() int k = s. Dequeue(); T Peek() Просмотр элемента в начале очереди T Peek() int k = s. Peek(); Count Количество элементов - свойство Count if (s.Count == 0) … bool Contains(T item) bool Contains(T item) – проверка, содержится ли данный элемент в очереди T[] ToArray() Преобразование в массив T[] ToArray() int[] k = s. ToArray();

Словарь Содержит коллекцию ключей и соответствующих им значений Динамически изменяет свой размер Создание Dictionary d = new Dictionary (); Add(TKey key, TValue value) Добавление Add(TKey key, TValue value) d.Add( два, new Complx(4,5)); s.Add( один, one); Remove(TKey key)Clear() Удаление Remove(TKey key), всех записей Clear() d.Remove(myComplexVar); [Tkey key] Доступ по ключу [Tkey key] Complex complexVar = d[ два ]; bool TryGetValue( TKey key, out TValue value) Безопасное получение значения по ключу bool TryGetValue( TKey key, out TValue value) if (d.TryGetValue( два, out myComplexVar)) … Проверка, содержится ли в словаре bool ContainsKey(TKey key) Ключ - bool ContainsKey(TKey key) bool ContainsValue( TValue value Значение - bool ContainsValue( TValue value Count Количество элементов в словаре – свойство Count Коллекции ( свойства ) Keys Keys – коллекция ключей Values Values – коллекция значений

HashSet HashSet - Множество (c.NET 3.5) SortedSet SortedSet - Сортированное множество (c.NET 4) Не позволяют дублировать значения Имеют операции на объединение, вычитание, пересечение множеств Add(T item) – Add(T item) – добавление элемента в множество bool Remove(T item) RemoveWhere(Predicate match) bool Remove(T item) – удаление элемента из множества. RemoveWhere(Predicate match) – по условию UnionWith(IEnumerable other) UnionWith(IEnumerable other) – объединение 2 множеств Overlaps(IEnumerable other) Overlaps(IEnumerable other) – пересечение множеств Проверка на вхождение одного множества в другое IsSubsetOf(IEnumerable other), IsProperSubsetOf( IEnumerable other ) IsSubsetOf(IEnumerable other), IsProperSubsetOf( IEnumerable other ) IsSupersetOf(IEnumerable other), IsProperSupersetOf(IEnumerable other) IsSupersetOf(IEnumerable other), IsProperSupersetOf(IEnumerable other) ExceptWith( IEnumerable other ) ExceptWith( IEnumerable other ) – вычитание множеств Contains(T item) Contains(T item) – проверка на вхождение элемента во множество Count Свойство Count – количество элементов в множестве

Коллекции Итераторы Типы, допускающие неопределенное значение Обработка исключений

Итератор Предоставляет единый способ перебора элементов коллекции Не обязательно перебрать все элементы. Последовательность может быть бесконечной Можно использовать в специальном цикле foreach() По чему можно итерировать ( перебирать элементы ) По классу, реализующему интерфейс IEnumerable или IEnumerable По методу ( свойству ), возвращающему IEnumerator или IEnumerator Все.NET коллекции реализуют интерфейс IEnumerable или IEnumerable. Следовательно по ним можно итерировать

Цикл по всем элементам массива или коллекции ( реализующий интерфейс IEnumerable или IEnumerable ) Синтаксис foreach in foreach ( Тип _ элемента Имя _ переменной in Коллекция ) { // Можно использовать элемент коллекции через Имя _ переменной } Запрещено изменять саму коллекцию ( добавлять, удалять элементы ) внутри цикла Пример : List collection = new List (); … // Заполнение коллекции foreach (Complex comp in collection) { Console.WriteLine(comp); // collection.Add(new Complex(5,4)); Так нельзя. Нельзя изменять саму коллекцию comp.Re = 7; // Так можно. Не меняет саму коллекцию, а меняет внутренности элемента }

Для возможности перебора элементов класс должен реализовывать интерфейс IEnumerable IEnumerable: interface IEnumerable { IEnumerator GetEnumerator(); } Метод GetEnumerator() должен возвращать тип, реализующий интерфейс IEnumerator IEnumerator: interface IEnumerator { object Current {get;} bool MoveNext(); void Reset(); }

Интерфейс IEnumerable - наследник от IEnumerable IEnumerable : interface IEnumerable : IEnumerable { IEnumerator GetEnumerator(); IEnumerator GetEnumerator(); } Метод GetEnumerator() должен возвращать тип, реализующий интерфейс IEnumerator и IEnumerator ( необходима явная реализация одного из методов ) IEnumerator : interface IEnumerator : IEnumerator, IDisposable { object Current {get;} T Current {get;} bool MoveNext(); void Reset(); Dispose(); }

Собственный итератор

Квазиключевое слово yield yield return yield return [expression] yield break yield break; Когда встречается yield Запоминается состояние и возвращается текущее значение На следующей итерации продолжаем с этого состояния Количество итерируемых элементов не обязательно конечно Примеры : public IEnumerator GetEnumerator() { yield return x; yield return y; yield return z; yield break; } int odd = -1; public IEnumerable GetCustomCollection() { while (true) yield return odd+=2; }

Коллекции и Итераторы

Коллекции Итераторы Типы, допускающие неопределенное значение Обработка исключений

Типы с неопределенным значением – расширение типов - значений неопределенным значением null Структура Nullable struct Nullable where T : struct, new() Свойства HasValue bool HasValue { get; } – определено ли значение или объект - null Value T Value {get; } - значение Синтаксис объявления Nullable Nullable value_type? value_type?- сокращенный вариант Примеры : ? int? nj = 5, nj = null; Nullable f = null; ? DateTime? ndt = GetNullableDate(), ndt2 = null;

Неопределенные значения в базах данных Трехзначная логика bool? Возможность неопределенного возвращаемого значения Расширение типов - значений неопределенным значением

Существует неявное преобразование из value_type в value_type? Обратное преобразование - только явное : int? nj; int j = (int)nj; Свойства HasValue – показывающее определено ли значение и Value - значение int i; int? ni = 5; if (ni.HasValue) i = ni.Value; Значение по умолчанию - null Можно получать доступ ко всем членам объекта типа DateTime? d = new DateTime(); d.Value.AddDays(4);

Можно выполнять обычные операции ( переопределены ) int? + int? => int? Если одно из значений не определено (null), то и результат не определен Если оба определены, то результат – сумма этих значений Можно сравнивать с null if (ni == null) ni = 5;

object1 ?? object2 Если object1 равен null, то результатом этого выражения будет object2, иначе object1 Использование Присваивание значения по умолчанию, если не определен Применимо к ссылочным и Nullabe типам Примеры : int? a; int i = a ?? 5; Если a == null, то i = 5, иначе i = a.Value

Nullable Types

Коллекции Итераторы Типы, допускающие неопределенное значение Обработка исключений

Возвращаемое значение Не всегда возможно ( конструкторы ) Не сразу проявляется Непонятно, что конкретно произошло Усложняет код Глобальная переменная Не проходит в многопоточной среде Вызов определенной функции или завершение программы Не проходит, если библиотеки независимы Обработка исключений

Ошибке ставится в соответствие некоторый объект – исключение (exception) Объект - исключение должен иметь тип, который является потомком System.Exception При возникновении ошибочной ситуации генерируется ( выбрасывается ) исключение if(j 3) throw throw new IndexOutOfRangeException();

Блок обработки исключений имеет следующий вид :try { try_statements } catch [catch(exception_type1 [name_1]) { catch1_statements } … catch … catch(exception_typeN [name_N]) { catchN_statements } ] finally [finally { finally_statements } ]

После генерации исключения рассматриваются блоки в порядке возрастания удаленности Статическая вложенность – вложенность блоков кода Динамическая вложенность – порядок вызовов в стеке В нем просматриваются все обработчики (catch) сверху вниз Если тип текущего исключения – потомок типа блока, блок выбирается для обработки После обработки исключения выполнение в каком - то блоке, остальные блоки игнорируются. Если исключение обработано, то выполнение продолжается с кода, следующего за обработавшим исключение try-catch-finally блоком Блок finally выполняется всегда при выходе из блока обработки исключения, независимо от того возникло ли исключение или нет, обработано ли они или нет. Блок finally выполнится всегда. Блок finally используют для освобождения ресурсов.

Message Поле Message – описание возникшего исключения Source Поле Source – ссылка на объект сгенерировавший исключение StackTrace Поле StackTrace – стек вызовов InnerExeption Поле InnerExeption – предыдущая исключительная ситуация ( при дальнейшей передачи исключения )

Исключения