Эта программа дает следующий результат.




Лабораторная работа №1

Тема: создание простых запросов на языке интегрированных запросов LINQ

Цели работы:

1. Получение навыков работы с простыми операторами языка LINQ.

2. Создание простого запроса на языке LINQ.

Пример выполнения программы с его последующим подробным разбором.

В приведенной ниже программе используется запрос для получения положительных значений, содержащихся в массиве целых значений.

// Сформировать простой запрос LINQ.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int[] nums = {1, -2, 3, 0, -4, 5 };

//Сформировать простой запрос на получение только положительных значений.

var posNums = from n in nums where n > 0 select n;

Console.Write("Положительные значения из массива nums: ");

// Выполнить запрос и отобразить его результаты.

foreach(int i in posNums) Console.Write(i + " ");

Console.WriteLine();

}

}

}

 

 

Эта программа дает следующий результат.

Как видите, в конечном итоге отображаются только положительные значения, хранящиеся в массиве nums. Несмотря на всю свою простоту, этот пример наглядно демонстрирует основные возможности LINQ. Поэтому рассмотрим его более подробно.

Прежде всего обратите внимание на применение в данном примере программы следующего оператора.

using System.Linq;

Для применения средств LINQ в исходный текст программы следует включить пространство имен System.Linq.

Затем в программе объявляется массив nums типа int. Все массивы в C# неявным образом преобразуются в форму интерфейса IEnumerable<T>. Благодаря этому любой массив в C# может служить в качестве источника данных, извлекаемых по запросу LINQ.

Далее объявляется запрос, по которому из массива nums извлекаются элементы только с положительными значениями.

var posNums = from n in nums where n > 0 select n;

Переменная posNums называется переменной запроса. В ней хранится ссылка на ряд правил, определяемых в запросе. Обратите внимание на применение ключевого слова var для объявления переменной posNums неявным образом. Как вам должно быть уже известно, благодаря этому переменная posNums становится неявно типизированной. Такими переменными удобно пользоваться в запросах, хотя их тип можно объявить и явным образом (это должна быть одна из форм интерфейса IEnumerable<T>). Объявляемой переменной posNums в итоге присваивается выражение запроса.

Все запросы начинаются с оператора from, определяющего два элемента. Первым из них является переменная диапазона, принимающая элементы из источника данных. В рассматриваемом здесь примере эту роль выполняет переменная n. Вторым элементом является источник данных (в данном случае — массив nums). Тип переменной диапазона выводится из источника данных. Поэтому переменная n относится к типу int. Ниже приведена общая форма оператора from.

from переменная_диапазона in источник_данных

Далее следует оператор where, обозначающий условие, которому должен удо­влетворять элемент в источнике данных, чтобы его можно было получить по запросу. Ниже приведена общая форма синтаксиса оператора where.

where будево_выражение

В этой форме булево_выражение должно давать результат типа bool. Такое выражение иначе называется предикатом. В запросе можно указывать несколько операторов where. В данном примере программы используется следующий оператор where.

where n > 0

Этот оператор будет давать истинный результат только для тех элементов массива, значения которых оказываются больше нуля. Выражение n > 0 будет вычисляться для каждого из n элементов массива nums при выполнении запроса. В итоге будут получены только те значения, которые удовлетворяют этому условию. Иными словами, оператор where выполняет роль своеобразного фильтра, отбирая лишь определенные элементы.

Все запросы оканчиваются оператором select или group. В данном примере используется оператор select, точно определяющий, что именно должно быть по­лучено по запросу. В таких простых примерах запросов, как рассматриваемый здесь, выбирается конкретное значение диапазона. Поэтому по данному запросу возвращаются только те целые значения, которые удовлетворяют условию, указанному в операторе where. В более сложных запросах можно дополнительно уточнять, что именно

следует выбирать. Например, по запросу списка рассылки может быть получена лишь фамилия адресата вместо его полного адреса. Обратите внимание на то, что оператор select завершается точкой с запятой, поскольку это последний оператор в запросе. А другие его операторы не оканчиваются точкой с запятой.

Итак, переменная запроса posNums создана, но результаты запроса пока еще не получены. Дело в том, что сам запрос определяет лишь ряд конкретных правил, а результаты будут только после выполнения запроса. Кроме того, один и тот же запрос может быть выполнен два раза или больше, причем с разными результатами, если в промежутке между последовательно производимыми попытками выполнить один и тот же запрос изменяется базовый источник данных. Поэтому одного лишь объявления переменной запроса posNums совершенно недостаточно для того, чтобы она содержала результаты запроса.

Для выполнения запроса в данном примере программы организуется следующий цикл.

foreach(int i in posNums) Console.WriteLine(i + " ");

В этом цикле переменная posNums указывается в качестве коллекции, к которой происходит обращение на каждом шаге цикла. В цикле foreach соблюдаются правила, определенные в запросе и доступные по ссылке из переменной posNums. На каждом шаге цикла возвращается очередной элемент, полученный из массива. Этот процесс завершается, когда запрашиваемых элементов в массиве больше не обнаружено. В данном примере тип int переменной шага цикла i указывается явно, поскольку по запросу извлекаются элементы именно этого типа. Явное указание типа переменной шага цикла вполне допустимо в тех случаях, когда заранее известен тип значения, вы­бираемого по запросу. Но в более сложных случаях оказывается проще, а иногда даже нужно, указывать тип переменной шага цикла неявным образом с помощью ключевого слова var.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: