C# 4.0 полное руководство - 2011
Шрифт:
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
будет преобразован компилятором в следующий вызов.
Where(х => х < 10)
Таким образом, оба способа формирования запросов в конечном итоге сходятся на одном и том же.
Но если оба способа оказываются в конечном счете равноценными, то какой из них лучше для программирования на С#? В целом, рекомендуется
Дополнительные методы расширения, связанные с запросами
Помимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable<T> в классе Enumerable. Ниже приведены наиболее часто используемые методы расширения, связанные с запросами. Многие из них могут перегружаться, поэтому они представлены лишь в самой общей форме.
Метод
Описание
All(predicate)
Возвращает логическое значение true, если все элементы в последовательности удовлетворяют условию, задаваемому параметром
.predicate
Any(predicate)
Возвращает логическое значение true, если любой элемент в последовательности удовлетворяет условию, задаваемому параметром
predicate
Average
Возвращает среднее всех значений в числовой последовательности
Contains(value)
Возвращает логическое значение true, если в последовательности содержится указанный объект
Count
Возвращает длину последовательности, т.е. количество составляющих ее элементов
First
Возвращает первый элемент в последовательности
Last
Возвращает последний элемент в последовательности
Max
Возвращает максимальное значение в последовательности
Min
Возвращает минимальное значение в последовательности
Sum
Возвращает сумму значений в числовой последовательности