Как следует из приведенного выше результата, данные, получаемые по запросу, группируются по имени домена самого верхнего уровня в адресе веб-сайта. Обратите внимание на то, как это делается в операторе group из следующего запроса. var webAddrs = from addr in websites where addr.LastlndexOf('.') != -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,
а переменная site шага внутреннего цикла — тип string. Ради краткости данного
примера обе переменные объявляются неявно, хотя их можно объявить и явным об
разом, как показано ниже.
foreach(IGrouping
При использовании в запросе оператора select или group иногда требуется сфор мировать временный результат, который будет служить продолжением запроса для по лучения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена об щая форма оператора into: into имя тело_запроса
где имя обозначает конкретное имя переменной диапазона, используемой для ци клического обращения к временному результату в продолжении запроса, на которое указывает тело_запроса. Когда оператор into используется вместе с оператором select или group, то его называют продолжением запроса, поскольку он продолжает запрос. По существу, продолжение запроса воплощает в себе принцип построения нового запроса по результатам предыдущего.
ПРИМЕЧАНИЕ Существует также форма оператора into, предназначенная для использования вместе с оператором join, создающим групповое объединение, о котором речь пойдет далее в этой главе.