
- •А.А. Волосевич
- •2. Базовые технологии платформы .Net 5
- •2. Базовые технологии платформы .Net 4
- •2. Базовые технологии платформы .Net
- •2.1. Работа с Числами
- •2.2. Дата и время
- •2.3. Работа со строками и текстом
- •2.4. Преобразование информации
- •2.5. Отношения равенства и порядка
- •Сравнение для выяснения равенства
- •Сравнение для выяснения порядка
- •2.6. Жизненный цикл объектов
- •Алгоритм «сборки мусора»
- •Финализаторы и интерфейс iDisposable
- •2.7. Перечислители и итераторы
- •2.8. Интерфейсы стандартных коллекций
- •2.9. Массивы и класс system.Array
- •2.10. Типы для работы с коллекциями-списками
- •2.11. Типы для работы с коллекциями-множествами
- •2.12. Типы для работы с коллекциями-словарями
- •2.13. Типы для создания пользовательских коллекций
- •2.14. Технология linq to objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •2.15. Работа с объектами файЛовой системы
- •2.16. Ввод и вывод информации
- •Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •Адаптеры потоков
- •2.17. Основы xml
- •2.18. Технология linq to xml
- •Создание, сохранение, загрузка xml
- •Запросы, модификация и трансформация xml
- •Пространства имен xml
- •2.19. ДОполнительные возможности обработки xml
- •2.20. Сериализация
- •Сериализация времени выполнения
- •Сериализация контрактов данных
- •2.21. Состав и взаимодействие сборок
- •2.22. Метаданные и получение информации о типах
- •2.23. Позднее связывание и кодогенерация
- •2.24. Динамические типы
- •2.25. Атрибуты
- •2.26. Файлы конфигуРации
- •2.27. Основы мНогопоточноГо программирования
- •2.28. Синхронизация потоков
- •2.29. Библиотека параллельных расширений
- •Параллелизм на уровне задач
- •Параллелизм при императивной обработке данных
- •Параллелизм при декларативной обработке данных
- •Обработка исключений и отмена выполнения задач
- •Коллекции, поддерживающие параллелизм
- •2.30. Асинхронный вызов методов
- •2.31. Процессы и домены
- •2.32. Безопасность
- •Разрешения на доступ
- •Изолированные хранилища
- •Криптография
- •2.33. Диагностика
2.14. Технология linq to objects
Платформа .NET версии 3.5 представила новую технологию работы с коллекциями ‑ Language Integrated Query (LINQ). По типу обрабатываемой информации LINQ делится на LINQ to Objects – библиотеки для обработки коллекций объектов в памяти; LINQ to SQL – библиотеки для работы с базами данных; LINQ to XML предназначена для обработки XML-информации. В данном параграфе акцент сделан LINQ to Objects.
Технически, LINQ to Objects – это набор классов, содержащих типичные методы обработки коллекций: поиск данных, сортировка, фильтрация. Ядром LINQ to Objects является статический класс Enumerable, размещенный в пространстве имен System.Linq1. Этот класс содержит набор методов расширения интерфейса IEnumerable<T>, которые в дальнейшем будут называться операторами LINQ. Для удобства дальнейшего изложения используем стандартное деление операторов LINQ на группы в зависимости от выполняемых действий:
-
Оператор условия Where (отложенные вычисления).
-
Операторы проекций (отложенные вычисления).
-
Операторы упорядочивания (отложенные вычисления).
-
Оператор группировки GroupBy (отложенные вычисления).
-
Операторы соединения (отложенные вычисления).
-
Операторы работы с множествами (отложенные вычисления).
-
Операторы агрегирования.
-
Операторы генерирования (отложенные вычисления).
-
Операторы кванторов и сравнения.
-
Операторы разбиения (отложенные вычисления).
-
Операторы элемента.
-
Операторы преобразования.
В примерах параграфа будут использоваться либо коллекции примитивных типов, либо коллекция gr объектов класса Student:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public IEnumerable<int> Marks { get; set; }
}
var gr = new List<Student>{
new Student {Name = "Smirnov", Age = 18, Marks = new[] {10, 8, 9}},
new Student {Name = "Ivanova", Age = 20, Marks = new[] {5, 6, 9}},
new Student {Name = "Kuznetsov", Age = 18, Marks = new[] {7, 7, 4}},
new Student {Name = "Sokolov", Age = 20, Marks = new[] {7, 8, 8}},
new Student {Name = "Lebedeva", Age = 20, Marks = new[] {9, 9, 9}}};
1. Оператор условия Where().
Оператор производит фильтрацию коллекции, основываясь на параметре-предикате. Сигнатуры оператора1:
IEnumerable<T> Where<T>(this IEnumerable<T> source,
Func<T, bool> predicate);
IEnumerable<T> Where<T>(this IEnumerable<T> source,
Func<T, int, bool> predicate);
Второй вариант оператора Where() позволяет указать индекс, начиная с которого будет применяться предикат (заметим, что многие другие операторы имеют перегруженную версию, устроенную по такому же принципу).
Примеры использования Where():
List<int> lst = new List<int> { 1, 3, -1, -4, 7 };
var r1 = lst.Where(x => x < 0);
var r2 = gr.Where(s => s.Age > 19);
var r3 = gr.Where((s, pos) => s.Age > 19 && pos < 3);