using System; using System.Linq;
class GroupByDemo { static void Main() {
string[] websites = {
"hsNameA.com", "hsNameB.net", "hsNameC.net",
’"hsNameD.com", "hsNameE.org", "hsNameF.org",
"hsNameG.tv", "hsNameH.net", "hsNamel.tv"
};
// Использовать методы запроса для группирования
// веб-сайтов по имени домена самого верхнего уровня.
var webAddrs = websites.Where(w => w.LastlndexOf) != 1).
GroupBy(x => x.Substring(x.LastlndexOf(".", x.Length)));
// Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {
Console.WriteLine("Веб-сайты, сгруппированные " +
"по имени домена " + sites.Key); foreach(var site in sites)
Console.WriteLine (" " + site);
Console.WriteLine();
}
}
}
Эта версия программы дает такой же результат, как и предыдущая. Единственное отличие между ними заключается в том, как формируется запрос. В данной версии для этой цели используются методы запроса.
Рассмотрим другой пример. Но сначала приведем еще раз запрос из представленного ранее примера применения оператораjoin.
var inStockList = from item in items
join entry in statusList
on item.ItemNumber equals entry.ItemNumber select new Temp(item.Name, entry.InStock);
По этому запросу формируется последовательность, состоящая из объектов, инкапсулирующих наименование товара и состояние его запасов на складе. Вся эта информация получается путем объединения двух источников данных:itemsиstatusList.Ниже приведен переделанный вариант данного запроса, в котором вместо синтаксиса, предусмотренного в C# для запросов, используется метод запросаJoin ().
// Использовать метод запроса Join() для составления списка // наименований товаров и состояния их запасов на складе, var inStockList = items.Join(statusList, kl => kl.ItemNumber, k2 => k2.ItemNumber,
(kl, k2) => new Temp(kl.Name, k2.InStock) );
В данном варианте именованный классTempиспользуется для хранения результирующего объекта, но вместо него можно воспользоваться анонимным типом. Такой вариант запроса приведен ниже.
var inStockList = items.Join(statusList, kl => kl.ItemNumber,
к2 => к2.ItemNumber,
(kl, к2) => new { kl.Name, k2.InStock} );
Синтаксис запросов и методы запроса
Как пояснялось в предыдущем разделе, запросы в C# можно формировать двумя способами, используя синтаксис запросов или методы запроса. Любопытно, что оба способа связаны друг с другом более тесно, чем кажется, глядя на исходный код программы. Дело в том, что синтаксис запросов компилируется в вызовы методов запроса. Поэтому код
where х < 10
будет преобразован компилятором в следующий вызов.