Сформировать запрос на получение списка



// веб-сайтов, группируемых  

По имени домена самого верхнего уровня, но выбрать только те

Группы, которые состоят более чем из двух членов.

Здесь ws — это переменная диапазона для ряда групп,

Возвращаемых при выполнении первой половины запроса,

var webAddrs = from addr in websites

where addr.LastIndexOf('.') != -1

Group addr by addr.Substring(addr.LastIndexOf('.'))

into ws where ws.Count() > 2 select ws;

 

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

Console.WriteLine("Домены самого верхнего уровня " +

"с более чем двумя членами.");

foreach(var sites in webAddrs) {

Console.WriteLine("Содержимое домена: " + sites.Key);

Foreach(var site in sites)

Console.WriteLine (" " + site);

Console.WriteLine();

}

}

}

 

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

 

Домены самого верхнего уровня с более чем двумя членами.

Содержимое домена: .net

HsNameB.net

HsNameC.net

HsNameH.net

 

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

Обратите особое внимание в данном примере программы на следующую последовательность операторов в формируемом запросе.

 

Group addr by addr.Substring(addr.LastIndexOf('.'))

into ws where ws.Count() > 2 select ws;

 

Сначала результаты выполнения оператора group сохраняются как временные для последующей обработки оператором where. В качестве переменной диапазона в данный момент служит переменная ws. Она охватывает все группы, возвращаемые оператором group. Затем результаты запроса отбираются в операторе where с таким расчетом, чтобы в конечном итоге остались только те группы, которые содержат больше двух членов. Для этой цели вызывается метод Count(), который является методом расширения и реализуется для всех объектов типа IEnumerable. Он возвращает количество элементов в последовательности. (Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге последовательность групп возвращается оператором select.

 

 

Применение оператора let для создания временной переменной в запросе

 

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

 

let имя = выражение

 

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

В приведенном ниже примере программы демонстрируется применение оператора let для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа char. Для этой цели служит еще один метод обработки строк, называемый ToCharArray() и возвращающий массив, содержащий символы в строке. Полученный результат присваивается переменной chrArray, которая затем используется во вложенном операторе from для извлечения отдельных символов из массива. И наконец, полученные символы сортируются в запросе, и из них формируется результирующая последовательность.

 

// Использовать оператор let в месте с вложенным оператором from.

using System;

using System.Linq;

 

class LetDemo {

static void Main() {

string[] strs = { "alpha", "beta", "gamma" };

 

Сформировать запрос на получение символов, возвращаемых из

Строк в отсортированной последовательности. Обратите внимание

На применение вложенного оператора from,

var chrs = from str in strs

let chrArray = str.ToCharArray()

from ch in chrArray orderby ch  

select ch;

 

Console.WriteLine("Отдельные символы, отсортированные по порядку:");

Выполнить запрос и вывести его результаты,

foreach(char с in chrs) Console.Write(с + " ");

 

Console.WriteLine();

}

}

 

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

 

Отдельные символы, отсортированные по порядку:

A a a a a b e g h l m m p t

 

Обратите внимание в данном примере программы на то, что в операторе let переменной chrArray присваивается ссылка на массив, возвращаемый методом str.ToCharArray().

 

let chrArray = str.ToCharArray()

 

После оператора let переменная chrArray может использоваться в остальных операторах, составляющих запрос. А поскольку все массивы в C# преобразуются в тип IEnumerable<T>, то переменную chrArray можно использовать в качестве источника данных для запроса во втором, вложенном операторе from. Именно это и происходит в рассматриваемом здесь примере, где вложенный оператор from служит для перечисления в массиве отдельных символов, которые затем сортируются по нарастающей и возвращаются в виде конечного результата.

Оператор let может также использоваться для хранения неперечислимого значения. В качестве примера ниже приведен более эффективный вариант формирования запроса в программе IntoDemo из предыдущего раздела.

 

var webAddrs = from addr in websites

let idx = addr.LastIndexOf('.') where idx != -1

group addr by addr.Substring(idx)  

into ws where ws.Count() > 2

select ws;

 

В этом варианте индекс последнего вхождения символа точки в строку присваивается переменной idx. Данное значение затем используется в методе Substring(). Благодаря этому исключается необходимость дважды искать символ точки в строке.

 

 


Дата добавления: 2019-02-12; просмотров: 273; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!