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

Неоднократное выполнение запросов

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

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

using System;

using System.Linq;

using System.Collections.Generic;

class SimpQuery {

static void Main() {

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.

Console.WriteLine("ХпЗадать значение 99 для элемента массива nums[l]."); nums[l] = 99;

Console.Write("Положительные значения из массива nums\n" +

"после изменений в нем: ");

// Выполнить запрос второй раз.

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

Console.WriteLine();

}

}

Вот к какому результату приводит выполнение этой программы.

Положительные значения из массива nums: 1 3 5

Задать значение 99 для элемента массива nums[l].

Перейти на страницу:

Похожие книги