Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vse_shpory_po_OOP_polnye.doc
Скачиваний:
6
Добавлен:
20.09.2019
Размер:
295.94 Кб
Скачать

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 прототипа этой операции:

  1. public static IEnumerable<S> SelectMany<T, S>

{

this IEnumerable<T> source,

Func<T, IEnumerable<S>> selector

};

Этот прототип операции получает входную последовательность элементов типа Т и делегат метода-селектора, а возвращает объект, который при перечислении проходит по входной последовательности, получая каждый элемент индивидуально из входной последовательности и передавая его в метод-селектор. Последний затем возвращает объект, который, будучи перечислимым, порождает ноль или более элементов типа S в промежуточной выходной последовательности.

  1. public static IEnumerable<S> SelectMany<T, S>

{

this IEnumerable<T> source,

Func<T, int, IEnumerable<S>> selector

};

Этот прототип ведет себя, как первый, за исключением, что методу-селектору дополнительно передается индекс, начинающийся с нуля, каждого элемента входной последовательности.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]