
- •А.А. Волосевич
- •1. Работа с Числами
- •2. Дата и время
- •3. Работа со строками и текстом
- •4. Преобразование информации
- •5. Отношения равенства и порядка
- •Сравнение для выяснения равенства
- •Сравнение для выяснения порядка
- •6. Жизненный цикл объектов
- •Алгоритм «сборки мусора»
- •Финализаторы и интерфейс iDisposable
- •7. Перечислители и итераторы
- •8. Интерфейсы стандартных коллекций
- •9. Массивы и класс system.Array
- •10. Типы для работы с коллекциями-списками
- •11. Типы для работы с коллекциями-множествами
- •12. Типы для работы с коллекциями-словарями
- •13. Типы для создания пользовательских коллекций
- •14. Технология linq to objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •15. Работа с объектами файЛовой системы
- •16. Ввод и вывод информации
- •Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •Адаптеры потоков
- •17. Основы xml
- •18. Технология linq to xml
- •Создание, сохранение, загрузка xml
- •Запросы, модификация и трансформация xml
- •Пространства имён xml
- •19. ДОполнительные возможности обработки xml
- •20. Сериализация
- •Сериализация времени выполнения
- •Сериализация контрактов данных
- •21. Состав и взаимодействие сборок
- •22. Метаданные и получение информации о типах
- •23. Позднее связывание и кодогенерация
- •24. Динамические типы
- •25. Атрибуты
- •26. Файлы конфигуРации
- •27. Основы мНогопоточноГо программирования
- •28. Синхронизация потоков
- •29. Библиотека параллельных расширений
- •Параллелизм на уровне задач
- •Параллелизм при императивной обработке данных
- •Параллелизм при декларативной обработке данных
- •Обработка исключений и отмена выполнения задач
- •Коллекции, поддерживающие параллелизм
- •30. Асинхронный вызов методов
- •31. Процессы и домены
- •32. Безопасность
- •Разрешения на доступ
- •Изолированные хранилища
- •Криптография
- •33. Диагностика
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);
}