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



foreach(var sites in webAddrs) {

Console.WriteLine("Веб-сайты, сгруппированные " +

"по имени домена" + sites.Key);

Foreach(var site in sites)

Console.WriteLine (" " + site);

Console.WriteLine();

}

}

}

 

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

 

Веб-сайты, сгруппированные по имени домена .соm

HsNameA.соm

HsNameD.соm

 

Веб-сайты, сгруппированные по имени домена .net

HsNameB.net

HsNameC.net

HsNameH.net

 

Веб-сайты, сгруппированные по имени домена .org

HsNameE.org

HsNameF.org

 

Веб-сайты, сгруппированные по имени домена .tv

HsNameG.tv

HsNamel.tv

 

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

 

var webAddrs = from addr in websites

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

group addr by addr.Substring(addr.LastIndexOf('.'));

 

Ключ в этом операторе создается с помощью методов LastIndexOf() и Substring(), определенных для данных типа string. (Эти методы упоминаются в главе 7, посвященной массивам и строкам. Вариант метода Substring(), используемый в данном примере, возвращает подстроку, начинающуюся с места, обозначаемого индексом, и продолжающуюся до конца вызывающей строки.) Индекс последней точки в адресе веб-сайта определяется с помощью метода LastIndexOf(). По этому индексу в методе Substring() создается оставшаяся часть строки, в которой содержится имя домена самого верхнего уровня. Обратите внимание на то, что в операторе where отсеиваются все строки, которые не содержат точку. Метод LastIndexOf() возвращает -1, если указанная подстрока не содержится в вызывающей строке.

Последовательность результатов, получаемых при выполнении запроса, хранящегося в переменной webAddrs, представляет собой список групп, поэтому для доступа к каждому члену группы требуются два цикла foreach. Доступ к каждой группе осуществляется во внешнем цикле, а члены внутри группы перечисляются во внутреннем цикле. Переменная шага внешнего цикла foreach должна быть экземпляром интерфейса IGrouping, совместимым с ключом и типом элемента данных. В рассматриваемом здесь примере ключи и элементы данных относятся к типу string. Поэтому переменная sites шага внешнего цикла имеет тип IGrouping<string, string>, а переменная site шага внутреннего цикла — тип string. Ради краткости данного примера обе переменные объявляются неявно, хотя их можно объявить и явным образом, как показано ниже.

 

foreach(IGrouping<string, string> sites in webAddrs) {

Console.WriteLine("Веб-сайты, сгруппированные " +

"по имени домена" + sites.Key);

Foreach(string site in sites)

Console.WriteLine(" " + site);

Console.WriteLine();

}

 

 

Продолжение запроса с помощью оператора into

 

При использовании в запросе оператора select или group иногда требуется сформировать временный результат, который будет служить продолжением запроса для получения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена общая форма оператора into:

 

Into имя тело_запроса

 

где имя обозначает конкретное имя переменной диапазона, используемой для циклического обращения к временному результату в продолжении запроса, на которое указывает тело_запроса. Когда оператор into используется вместе с оператором select или group, то его называют продолжением запроса, поскольку он продолжает запрос. По существу, продолжение запроса воплощает в себе принцип построения нового запроса по результатам предыдущего.

-------------------------------

ПРИМЕЧАНИЕ

Существует также форма оператора into, предназначенная для использования вместе с оператором join, создающим групповое объединение, о котором речь пойдет далее в этой главе.

-------------------------------

Ниже приведен пример программы, в которой оператор into используется вместе с оператором group. Эта программа является переработанным вариантом предыдущего примера, в котором список веб-сайтов формируется по имени домена самого верхнего уровня. А в данном примере первоначальные результаты запроса сохраняются в переменной диапазона ws и затем отбираются для исключения всех групп, состоящих менее чем из трех элементов.

 

// Использовать оператор into вместе с оператором group.

using System;

using System.Linq;

 

class IntoDemo {

static void Main() {

string[] websites = { "hsNameA.com", "hsNameB.net",

"hsNameC.net", "hsNameD.com", "hsNameE.org", "hsNameF.org",

"hsNameG.tv", "hsNameH.net", "hsNamel.tv"

};

 


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

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






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