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

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 на группы в зависимости от выполняемых действий:

  1. Оператор условия Where (отложенные вычисления).

  2. Операторы проекций (отложенные вычисления).

  3. Операторы упорядочивания (отложенные вычисления).

  4. Оператор группировки GroupBy (отложенные вычисления).

  5. Операторы соединения (отложенные вычисления).

  6. Операторы работы с множествами (отложенные вычисления).

  7. Операторы агрегирования.

  8. Операторы генерирования (отложенные вычисления).

  9. Операторы кванторов и сравнения.

  10. Операторы разбиения (отложенные вычисления).

  11. Операторы элемента.

  12. Операторы преобразования.

В примерах параграфа будут использоваться либо коллекции примитивных типов, либо коллекция 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);