Слайд 2
Работа с наборами данных
Как хранить и обрабатывать наборы
данных?
Массивы
Коллекции
Слайд 3
Массивы
Ограничивается доступным размером памяти*
Размер массива должен быть указан
при его создании.
Массивы могут хранить как ссылочные типы,
так и типы значений.
Слайд 4
Массивы
Массив является индексированной коллекцией объектов.
Одномерный массив объектов
объявляется следующим образом.
type[] arrayName;
Слайд 5
Многомерный массив
Концептуально, многомерный массив с двумя измерениями напоминает
сетку (таблицу).
Многомерный массив с тремя измерениями напоминает куб.
type[,]
arrayName;
Слайд 6
Массив массивов
Одним из вариантов многомерного массива является массив
массивов. Массив массивов представляет собой одномерный массив, в котором
каждый элемент является массивом. Элементы массива не обязаны иметь одинаковый размер.
type[][] arrayName;
Слайд 7
Массив массивов
Шаг 1: выделяем память под одномерный массив.
int[][]
jaggedArray = new int[3][];
Шаг 2: Для каждого элемента одномерного
массива выделяем память под одномерный массив
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
Слайд 8
Массив объектов
Создание массива объектов в отличие от создания
массива простых типов данных происходит в два этапа.
Сначала
необходимо объявить массив.
А затем создать объекты для хранения в нем.
Слайд 9
Массив объектов
Создадим класс
class Class1 {int x;}
Теперь создадим массив
от этого класса
Class1[] mas = new Class1[10];
for(int i =
0; i < 10; ++i)
{
mas[i] = new Class1();
}
Слайд 10
Другие коллекции
Рассмотрим другие коллекции, часто используемые в программировании:
ArrayList
List
Dictionary
Stack
Queue
Слайд 11
Библиотеки с коллекциями
Большая часть классов коллекций содержится в
пространствах имен System.Collections, System.Collections.Generic и System.Collections.Specialized.
Также для обеспечения
параллельного выполнения задач и многопоточного доступа применяются классы коллекций из пространства имен System.Collections.Concurrent
Слайд 12
Основа коллекций
Основой для создания всех коллекций является реализация
интерфейсов IEnumerator и IEnumerable.
Слайд 13
IEnumerator
Интерфейс IEnumerator представляет перечислитель, с помощью которого становится
возможен последовательный перебор коллекции, например, в цикле foreach.
Слайд 14
IEnumerable
Интерфейс IEnumerable через свой метод GetEnumerator предоставляет
перечислитель всем классам, реализующим данный интерфейс.
Поэтому интерфейс IEnumerable
(IEnumerable) является базовым для всех коллекций.
Слайд 15
ArrayList
Реализует интерфейс IList с помощью массива с динамическим
изменением размера по требованию.
Слайд 19
Пример
ArrayList array = new ArrayList();
array.Add("Hello");
array.Add('I');
array.Add(1);
Console.WriteLine(" Count:
{0}", array.Count);
Console.WriteLine(" Capacity: {0}", array.Capacity);
Console.Write(" Values:");
for(int i
= 0; i < array.Count; ++i)
{
Console.Write(" {0}", array[i]);
}
Слайд 20
List
Представляет строго типизированный список объектов, доступных по индексу.
Класс
List является универсальным эквивалентом класса ArrayList. Он реализует универсальный
интерфейс IList с помощью массива, размер которого динамически увеличивается по мере необходимости.
Слайд 21
Что лучше
Делая выбор между классами List и ArrayList,
предлагающими сходные функциональные возможности, следует помнить, что класс List
в большинстве случаев обрабатывается быстрее и является потокобезопасным. Если в качестве типа T класса List используется ссылочный тип, оба класса действуют идентичным образом.
Слайд 25
Пример List
List cars = new List();
cars.Add("BMW");
cars.Add("Mersedes");
cars.Add("Ford Mustang");
cars.Add("Corvette");
cars.Add("Jaguar");
for (int
i = 0; i < cars.Count; ++i)
{
Console.Write(" {0}",
cars[i]);
}
Console.ReadKey();
Слайд 26
Queue
Представляет коллекцию объектов, основанную на принципе "первым вошёл
— первым вышел". (FIFO)
Добавление элементов происходит в конец списка.
Извлечение из начала списка.
Слайд 30
Как она реализована
Этот класс реализует универсального очередь в
виде циклического массива. Объекты, хранящиеся в Queue вставляются с
одной стороны, и извлекаются с другой.
Слайд 31
Пример
Queue numbers = new Queue();
numbers.Enqueue("one");
numbers.Enqueue("two");
numbers.Enqueue("three");
numbers.Enqueue("four");
numbers.Enqueue("five");
Console.WriteLine(numbers.Peek());
Console.WriteLine(numbers.Dequeue());
Console.WriteLine(numbers.Dequeue());
Console.WriteLine(numbers.Peek());
Console.WriteLine(numbers.Peek());
Слайд 32
Stack
Представляет коллекцию переменного размера экземпляров одинакового заданного типа,
обслуживаемую по принципу "последним пришел - первым вышел" (LIFO).
Это
означает, что новый элемент вставляется в начало и извлекается из начала.
Слайд 36
Пример
Stack numbs = new Stack();
numbs.Push("one");
numbs.Push("two");
numbs.Push("three");
numbs.Push("four");
numbs.Push("five");
Console.WriteLine(numbs.Peek());
Console.WriteLine(numbs.Pop());
Console.WriteLine(numbs.Pop());
Console.WriteLine(numbs.Peek());
Console.WriteLine(numbs.Peek());
Слайд 37
Что-когда используется?
Очереди и стеки полезны, когда требуется временное
хранилище для данных;
Очередь Queue используют, когда необходимо получить
доступ к данным в том же порядке, в котором их сохранят.
Стек Stack используют, когда требуется доступ к данным в обратном порядке.
Слайд 38
Dictionary
Ассоциативная коллекция. Представляет собой набор пар ключ-значение.
Слайд 42
Словарь
Dictionary Универсальный класс предоставляющий сопоставление из набора ключей
для набора значений.
Каждый ключ в Dictionary должно быть
уникальным
Слайд 43
Пример
Dictionary dict = new Dictionary();
dict.Add("txt", "notepad.exe");
dict.Add("bmp",
"paint.exe");
dict.Add("dib", "paint.exe");
dict.Add("rtf", "wordpad.exe");
foreach (KeyValuePair kvp in dict)
{
Console.WriteLine("Key =
{0}, Value = {1}", kvp.Key, kvp.Value);
}
Слайд 44
foreach
Оператор foreach повторяет группу вложенных операторов для каждого
элемента массива или коллекции объектов, реализующих интерфейс System.Collections.IEnumerable или
System.Collections.Generic.IEnumerable.
Слайд 45
foreach
foreach( in )
Нельзя использовать,
если требуется изменять размер коллекции (добавлять или удалять из
нее элементы)!
Слайд 46
Пример
foreach (var kvp in dict)
{
Console.WriteLine("Key = {0}, Value
= {1}", kvp.Key, kvp.Value);
}
foreach(var car in cars)
{
Console.Write(" {0}",
car);
}
Слайд 47
Индексаторы
Индексаторы позволяют индексировать экземпляры класса или структуры точно
так же, как и массивы.
Индексаторы напоминают свойства за
исключением того, что их методы доступа принимают параметры.
Слайд 48
Пример
Создадим класс, в нем массив (нам же нужно
будет откуда-то брать элементы) и индексатор
Слайд 49
Пример 2
Индексатор может принимать более одного параметра
Слайд 50
Как сделать не получится
Но реализовать индексатор типа «массив
массивов» нельзя
Слайд 51
Пример
Не забудем про конструктор (к слову, зачем он
нужен)
Слайд 52
Как использовать
Поработаем с одномерным индексатором