- •1. Жизненный цикл объекта.
- •2.Делегаты. Назначение, синтаксис объявления, использование делегата. Событийная модель.
- •3. События. Объявление события. Шаблон проектирования события в классе. Свойство для безопасной работы с событиями. Безопасный вызов события в многопоточном программировании.
- •4. Обобщенные классы. Объявление и детализация класса типами пользователя.
- •5. Обобщенные методы. Объявление и детализация методов типами пользователя.
- •6. Ограничения на параметры в обобщенных классах и функциях.
- •7. Типы, допускающие значение null
- •8. Коллекции и итераторы. Оператор yield
- •9.Потоки ввода/вывода в c#. Создание объекта потока и работа с ним. Текстовые, бинарные потоки, потоки со сжатием данных.
- •11. Исключения. Создание класса пользовательского исключения. Генерация и перехват исключения.
- •12. Рефлексия типов. Класс типа Type. Методы и свойства класса.
- •13. Сборки. Статическое и динамическое связывание сборок. Класс сборки Assembly.
- •14. Позднее связывание. Класс System.Activator. Создание экземпляра объекта путем позднего связывания. Вызов методов объекта путем позднего связывания.
- •15. Атрибуты. Назначение атрибутов. Базовый класс атрибута. Аннотирование класса атрибутами.
- •16. Расширяющие методы.
- •17. Анонимные методы. Объявление и использование.
- •18. Захват переменных анонимными методами. Цепочка вызовов.
- •20. Захват переменных в лямбда-выражениях. Рекурсивный вызов в лямбда-выражениях. Анонимная рекурсия.
- •21. Выражения и деревья выражений. Стандартные делегаты, используемые с выражениями и деревьями выражений.
- •22. Комбинирование выражений посредством класса InvocatedExpression.
- •23. Язык интегрированных запросов linq. Назначение, технические средства для реализации языка. Группы языка linq.
- •24. Linq to Objects. Вид запроса. Вызов цепочек расширяющих методов. Языковые конструкции для кодирования запроса. Отложенное и неотложенное выполнение запроса.
- •25. Конструкция from…select… Разделы конструкции. Условия. Проекция. Анонимные типы данных.
- •26. Конструкция from…group… Разделы конструкции. Условия. Ключи группировки. Получение ключа в результате-выборке.
- •28. Linq to Objects. Расширяющие методы для преобразования типов, операций со множествами, преобразования в один элемент.
- •29. Технология linq to sql. Назначение технологии. Класс контекста данных и основные атрибуты для создания контекста данных.
- •30. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
24. Linq to Objects. Вид запроса. Вызов цепочек расширяющих методов. Языковые конструкции для кодирования запроса. Отложенное и неотложенное выполнение запроса.
LINQ to Objects – название для IEnumerable<T>API для стандартных операций запросов; применительно к различным объектам (списки, карты, массивы); стандартные операции запросов – это статические методы класса System.Linq.Enumerablе. Обеспечивает возможность запросов любых объектов С#, находящихся в памяти, таких как массивы, списки и другие типы коллекций.
LINQ строго типизирован. Выражения запросов LINQ транслируются в цепочки вызовов расширяющих методов на последовательности или коллекции. Этот набор расширяющих методов четко определен и носит название стандартных операций запросов. Пример:
var query = from employee in employees
where employee.Salary > 100000
orderby employee.LastName, employee.FirstName
select new {LastName = employee.LastName, FirstName = employee .FirstName} ;
Для того чтобы использовать Linq To Object необходимо подключить System.Linq.
Каждое выражение запроса в Linq To Object начинается с конструкции from, объявляющей то, что называется переменной диапазона. Конструкция from очень похожа на оператор foreach в том, что осуществляет итерацию по коллекции employees, и на каждом шаге сохраняет каждый элемент коллекции в переменной (в нашем случае, employee). После конструкции from запрос состоит из последовательности инструкций, где можно использовать различные операции запроса для фильтрации данных, представленных переменной диапазона. В нашем примере это конструкции where и orderby. И, наконец, выражение закрывается операцией проекции. Конечный результат построения выражения запроса сосредоточен в том, что называется переменной запроса, в нашем примере — query. Переменная запроса query имеет анонимный тип.
LINQ построен на использовании стандартных операций запросов, которые представляют собой методы, предназначенные для операций с последовательностями, подобными коллекциям, которые реализуют интерфейсы IEnumerable и IQueryable. Когда компилятор С# встречает выражение запроса, то преобразует в последовательность или цепочку запросов расширяющих методов, реализующих это поведение.
У такого подхода есть два преимущества. Одно состоит в том, что можно выполнять те же действия, что и выражение запроса LINQ, явно вызывая расширяющие методы. Результирующий код не так легко читать, как код с выражениями запросов. Однако бывают случаи, когда нужна функциональность расширяющих методов, а полное выражение запроса, может быть излишним.
Самое большое преимущество такого подхода связано с расширяемостью LINQ. То есть мы можем определить собственный набор расширяющих методов, а компилятор сгенерирует их вызовы при компиляции выражения запроса LINQ.
С# 2008 представил небольшой набор новых ключевых слов для создания выражений запросов LINQ: from, join, where, group, into, let, orderby и select.
Каждый запрос начинается с ключевого слова from. Оно определяет переменную диапазона, т.е. локальную переменную для каждого элемента коллекции. Потом in и указывается коллекция. Можно указывать 2 локальных переменных: from x, y in arr1. Коллекцию должен реализовывать интерфейс IEnumerable <T>.
Используются также конструкции:
Where <условие отбора> - указывается для нее предикат - любое логическое выражение.
Join – для присоединения другой таблицы
Orderby - для сортировки
Select - проектор (который генерирует конечный результат) <выражение для проектора>, оно транслируется в λ-выражение.
Group – группировка.
Let – вводит внутреннюю переменную, для того, чтобы избавится от повторений выражений в LINQ запросе.
Отложенные и не отложенные запросы.
Важно помнить, что хотя многие из стандартных операций запросов прототипированы на возврат IEnumerable<T>, и мы воспринимаем IEnumerable<T> как последовательность, на самом деле операции не возвращают последовательность в момент их вызова. Вместо этого операции возвращают объект, который при перечислении порождает (yield) очередной элемент последовательности. Во время перечисления возвращенного объекта запрос выполняется, и порожденный элемент помещается в выходную последовательность. Таким образом, выполнение запроса отложено. Отложенную операцию легко вычислить, поскольку она должна возвращать тип IEnumerable<T> или IOrderedEnumerable<T>(примеры отложенных операций: where и select).
Не отложенных операции (nondeferred) - их легко отличить по типу возврата, отличающемуся от IEnumerable<T> или IOrderedEnumerable<T>. Примеры не отложенных операций: ToArray<T> - создает массив типа Т из входной последовательности типа Т; ToList<T> - создает лист типа Т из входной последовательности типа Т. Запросы на группировку или сортировку всегда неотложенные. При их выполнении создается итератор, выполняется проход и дополнительные действия.