- •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. Создание и подключение класса контекста данных к базе данных. Шаблон программирования при добавлении данных в объект контекста данных.
26. Конструкция from…group… Разделы конструкции. Условия. Ключи группировки. Получение ключа в результате-выборке.
Конструкция from и переменные диапазона. Каждый запрос начинается со слова from. Конструкция from— это генератор, который также определяет переменную диапазона — локальную переменную, используемую для представления каждого элемента входной коллекции, по мере применения к нему выражения запроса. Конструкция from похожа на оператор foreach в стиле императивного программирования, а переменная диапазона идентична по своему предназначению переменной итерации в том же foreach. Выражение запроса может содержать более одной конструкции from. В таком случае имеется более одной переменной диапазона, что является аналогом вложенных операторов foreach. Пример:
var query = from x in Enumerable . Range(0, 10)
from у in Enumerable.Range(0, 10)
select new { X = x, Y = y,Product = x * у};
Конструкция group. Выражение запроса может иметь необязательную конструкцию group, которая является мощным средством для разделения ввода запроса. Конструкция group— это проектор, поскольку проектирует данные на коллекцию интерфейсов IGrouping. Интерфейс IGrouping определен в пространстве имен System.Linq и наследует IEnumerable. Поэтому можно применять интерфейс IGrouping везде, где можно использовать интерфейс IEnumerable. IGrouping включает свойство по имени Key. которое является объектом, описывающим подмножество. Каждый результирующий набор формируется применением операции эквивалентности между Key и фрагментом входных данных либо данных, производных от входных. Пример:
// Разделение чисел на четные и нечетные.
var query = from х in numbers
group x by x % 2; // x % 2 – ключ группировки
В запросе отсутствует конструкция select. Конечным результатом запроса является последовательность из двух экземпляров IGrouping. Первый экземпляр— результирующая последовательность, содержащая четные числа, а вторая содержит нечетные числа. Внутренне компилятор транслирует каждую конструкцию group в вызов стандартной операции запроса GroupBy. Конструкция group может также разделять входную коллекцию, используя множественные ключи, также известные, как составные ключи. Чтобы выполнить такую группировку, можно воспользоваться анонимным типом для представления множественных ключей в запросе.
Конструкция into и продолжение. Ключевое слово into подобно ключевому слову let в том, что оно определяет локальный по отношению к контексту запроса идентификатор. Используя конструкцию into, мы сообщаем запросу, что хотим присвоить результат операции group или join идентификатору, который может быть использован в запросе позднее. На языке запросов это называется продолжением (continuation), поскольку конструкция group — не финальный проектор запроса. Однако конструкция into работает как генератор, во многом подобно конструкциям from, и идентификатор, представленный into, подобен переменной диапазона в конструкции from.
// Разделение чисел на четные и нечетные
var query = from х in numbers
group x by x % 2 into partition
where partition.Key = 0
select new {Key = partition.Key, Count = partition.Count(), Group = partition};
В этом запросе продолжение, т.е. часть запроса, следующая после конструкции into, фильтрует серии групп, где Key равно 0, используя конструкцию where.
27. Агрегированные операции с помощью LINQ to Objects. Метод IEnumerable<T>. SelectMany( ).
Термином "LINQ to Objects" называют использование запросов LINQ непосредственно с коллекциями IEnumerable или IEnumerable<T> без промежуточных поставщиков LINQ или API-интерфейсов, таких как LINQ to SQL или LINQ to XML. LINQ можно использовать для запроса любых перечислимых коллекций, таких как List<T>, Array или Dictionary<TKey, TValue>. Коллекция может быть определенной пользователем или возвращенной API .NET Framework.
Агрегированные операции относятся к не отложенным операциям в LINQ to Object. Они позволяют выполнять агрегатные операции над элементами входной последовательности.
Операция Count возвращает количество элементов во входной последовательности. Два прототипа: 1) public static int Count<T> (this IEnumerable<T> source);
2) public static int Count<T> ( this IEnumerable<T> source, Func<T, bool> predicate) ;
Операция LongCount возвращает количество элементов входной последовательности как значение типа long. Два прототипа: 1) public static long LongCount<T>( this IEnumerable<T> source); 2) public static int LongCount<T>( this IEnumerable<T> source, Func<T, bool> predicate) ;
Операция Sum возвращает сумму числовых значений, содержащихся в элементах последовательности. Два прототипа: 1) public static Numeric Sum(this IEnumerable<Numeric> source); Тип Numeric должен быть одним из int, long, double или decimal, либо одним из их допускающих null эквивалентов: int?, long?, double? или decimal?. 2) public static Numeric Sum<T> ( this IEnumerable<T> source, Func<T, Numeric> selector);
Операция Min возвращает минимальное значение входной последовательности. Четыре прототипа: 1) public static Numeric Min ( this IEnumerable<Numeric> source); 2) public static Т Min<T> ( this IEnumerable<T> source); 3) public static Т Min<T>(this IEnumerable<T> source, Func<T, Numeric> selector);
4) public static S Min<T, S>(this IEnumerable<T> source, Func<T, S> selector);
Операция Max возвращает максимальное значение из входной последовательности. Четыре прототипа: 1) public static Numeric Мах( this IEnumerable<Wumeric> source); 2) public static T Max<T>(this IEnumerable<T> source); 3) public static Т Мах<Т>(this IEnumerable<T> source, Func<T, Numeric> selector);
4) public static S Мах<Т, S> ( this IEnumerable<T> source, Func<T, S> selector);
Операция Average возвращает среднее арифметическое числовых значений элементов входной последовательности. Два прототипа: 1) public static Result Average ( this IEnumerable<Numeric> source); 2) public static Result Average<T>(this IEnumerable<T> source, Func<T, Numeric> selector);
Операция Aggregate выполняет специфицированную пользователем функцию на каждом элементе входной последовательности, передавая значение, возвращенное этой функцией для предыдущего элемента, и возвращая ее значение для последнего элемента. Два прототипа:
1) public static Т Aggregate<T>( this IEnumerable<T> source, Func<T, T, T> func) ; 2) public static U Aggregate<T, U> ( this IEnumerable<T> source, U seed, Func<U, T, U> func) ;
IEnumerable<T> - это интерфейс, реализуемый всеми обобщенными классами коллекций С#, как и массивами. Этот интерфейс представляет перечисление элементов коллекций.
Последовательность – логический термин для коллекций, реализующий интерфейс IEnumerable<T>.
Большинство стандартных операций запросов представляют собой расширяющие методы в статическом классе System.Linq.Enumerable и прототипированы IEnumerable<T> в качестве первого аргумента.
Методы стандартных операций запросов класса System.Linq.Enumerable, которые не являются расширяющими методами – это просто статические методы, которые должны быть вызваны на классе System.Linq.Enumerable.
Методы: 1) GetEnumerator - возвращает перечислитель, который осуществляет перебор элементов коллекции (унаследовано от IEnumerable); 2)GetEnumerator( ) - возвращает перечислитель, выполняющий итерацию в коллекции.
Операция SelectMany используется для создания выходной последовательности – проекции «один ко многим» из входной последовательности. В то время как операция Select возвращает один выходной элемент для каждого входного элемента, SelectMany вернет ноль или более выходных элементов для каждого входного.
Существует 2 прототипа этой операции:
public static IEnumerable<S> SelectMany<T, S>
{
this IEnumerable<T> source,
Func<T, IEnumerable<S>> selector
};
Этот прототип операции получает входную последовательность элементов типа Т и делегат метода-селектора, а возвращает объект, который при перечислении проходит по входной последовательности, получая каждый элемент индивидуально из входной последовательности и передавая его в метод-селектор. Последний затем возвращает объект, который, будучи перечислимым, порождает ноль или более элементов типа S в промежуточной выходной последовательности.
public static IEnumerable<S> SelectMany<T, S>
{
this IEnumerable<T> source,
Func<T, int, IEnumerable<S>> selector
};
Этот прототип ведет себя, как первый, за исключением, что методу-селектору дополнительно передается индекс, начинающийся с нуля, каждого элемента входной последовательности.