group addr by addr.Substring(addr.LastlndexOf('.'));
// Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {
Console.WriteLine("Веб-сайты, сгруппированные " +
"по имени домена" + sites.Key); foreach(var site in sites)
Console.WriteLine (" " + site);
Console.WriteLine;
}
}
}
Вот к какому результату приводит выполнение этого кода.
Веб-сайты, сгруппированные по имени домена .сот
hsNameA.сот hsNameD.сот
Веб-сайты, сгруппированные по имени домена .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.LastlndexOf('.') != -1
group addr by addr.Substring(addr.LastlndexOf('.'));
Ключ в этом операторе создается с помощью методовLastlndexOf иSubstring , определенных для данных типаstring.(Эти методы упоминаются в главе 7, посвященной массивам и строкам. Вариант методаSubstring , используемый в данном примере, возвращает подстроку, начинающуюся с места, обозначаемого индексом, и продолжающуюся до конца вызывающей строки.) Индекс последней точки в адресе веб-сайта определяется с помощью методаLastlndexOf.По этому индексу в методеSubstring создается оставшаяся часть строки, в которой содержится имя домена самого верхнего уровня. Обратите внимание на то, что в оператореwhereотсеиваются все строки, которые не содержат точку. МетодLastlndexOf возвращает -1, если указанная подстрока не содержится в вызывающей строке.
Последовательность результатов, получаемых при выполнении запроса, хранящегося в переменнойwebAddrs,представляет собой список групп, поэтому для доступа к каждому члену группы требуются два циклаforeach.Доступ к каждой группе осуществляется во внешнем цикле, а члены внутри группы перечисляются во внутреннем цикле. Переменная шага внешнего циклаforeachдолжна быть экземпляром интерфейсаI Grouping,совместимым с ключом и типом элемента данных. В рассматриваемом здесь примере ключи и элементы данных относятся к типуstring.Поэтому переменнаяsitesшага внешнего цикла имеет типIGrouping