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

15. Технология 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():

var list = new List<int> {1, 3, -1, -4, 7};

var r1 = list.Where(x => x < 0);

var r2 = gr.Where(student => student.Age > 19);

var r3 = gr.Where((student, pos) => student.Age > 19 && pos < 3);

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);

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

var r1 = gr.Select(student => student.Name);

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

var r3 = gr.SelectMany(student => student.Marks);

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