Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.docx
Скачиваний:
15
Добавлен:
02.11.2018
Размер:
626.37 Кб
Скачать

2. Операторы проекций.

Операторы проекций применяются для выборки информации, при этом они могут изменять тип элементов итоговой коллекции. Основным оператором проекции является Select():

IEnumerable<S> Select<T, S>(this IEnumerable<T> source,

Func<T, S> selector);

Оператор SelectMany() может применяться в том случае, если результатом проекции является набор данных. В этом случае оператор соединяет все элементы набора в одну коллекцию.

IEnumerable<S> SelectMany<T, S>(this IEnumerable<T>source,

Func<T, IEnumerable<S>> selector);

Примеры использования операторов проекций:

IEnumerable<string> r1 = gr.Select(s => s.Name);

var r2 = gr.Select(s => new {s.Name, s.Age});

IEnumerable<int> r3 = gr.SelectMany(s => s.Marks);

Коллекция r1 будет содержать имена студентов. Коллекция r2 состоит из объектов анонимного типа с полями Name и Age. Коллекция r3 – это все оценки студентов (пятнадцать элементов int).

3. Операторы упорядочивания.

Данные операторы выполняют сортировку коллекций. Операторы OrderBy() и OrderByDescending() выполняют сортировку по возрастанию или убыванию соответственно. Имеется версия данных операторов, принимающая в качестве дополнительного параметра объект, реализующий IComparer<T>.

IOrderedEnumerable<T> OrderBy<T, K>(this IEnumerable<T> source,

Func<T, K> keySelector);

IOrderedEnumerable<T> OrderByDescending<T, K>(this IEnumerable<T> src,

Func<T, K> keySelector);

Интерфейс IOrderedEnumerable<T> является наследником IEnumerable<T> и описывает упорядоченную последовательность элементов с указанием на ключ сортировки. Если после выполнения сортировки по одному ключу требуется дополнительная сортировка по другому ключу, нужно воспользоваться операторами ThenBy() и ThenByDescending(). Имеется также оператор Reverse(), обращающий коллекцию.

Пример использования операторов упорядочивания:

var r1 = Enumerable.Reverse(gr);

var r2 = gr.OrderBy(s => s.Age);

var r3 = gr.OrderByDescending(s => s.Age).ThenBy(s => s.Name);

Чтобы получить коллекцию r1, метод расширения использовался как обычный статический метод класса, так как у List<T> имеется собственный метод Reverse(). В коллекции r3 студенты упорядочены по убыванию возраста, а при совпадении возрастов – по фамилиям в алфавитном порядке.

4. Оператор группировки GroupBy().

Оператор группировки GroupBy() разбивает коллекцию на группы элементов с одинаковым значением некоторого ключа. Оператор GroupBy имеет перегруженные версии, позволяющие указать селектор ключа, преобразователь элементов в группе, объект, реализующий IEqualityComparer<T> для сравнения ключей. Простейшая версия оператора группировки имеет следующий вид:

IEnumerable<IGrouping<K, T>> GroupBy<T, K>(this IEnumerable<T> src,

Func<T, K> keySelector);

Здесь последний параметр указывает на функцию, которая строит по элементу поле-ключ. Обычно эта функция просто выбирает одно из полей объекта. Интерфейс IGrouping<K, T> унаследован от IEnumerable<T> и содержит дополнительное типизированное свойство Key ‑ ключ группировки.

Приведём пример использования оператора группировки. Сгруппируем студентов по возрасту и для каждой группы выведем ключ и элементы:

var r1 = gr.GroupBy(s => s.Age);

foreach (IGrouping<int, Student> group in r1)

{

Console.WriteLine(group.Key);

foreach (Student student in group)

Console.WriteLine(student.Name);

}