// наименований товаров и состояния их запасов на складе,
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,
k2 => k2.ItemNumber,
(kl, k2) => new { kl.Name, k2.InStock} );
Как пояснялось в предыдущем разделе, запросы в C# можно формировать двумя способами, используя синтаксис запросов или методы запроса. Любопытно, что оба способа связаны друг с другом более тесно, чем кажется, глядя на исходный код программы. Дело в том, что синтаксис запросов компилируется в вызовы методов запроса. Поэтому код
where х < 10
будет преобразован компилятором в следующий вызов.
Where(х => х < 10)
Таким образом, оба способа формирования запросов в конечном итоге сходятся на одном и том же.
Но если оба способа оказываются в конечном счете равноценными, то какой из них лучше для программирования на С#? В целом, рекомендуется чаще пользоваться синтаксисом запросов, поскольку он полностью интегрирован в язык С#, поддерживается соответствующими ключевыми словами и синтаксическим конструкциями.
Помимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable
в классе Enumerable
. Ниже приведены наиболее часто используемые методы расширения, связанные с запросами. Многие из них могут перегружаться, поэтому они представлены лишь в самой общей форме.
Метод
Описание
All(
Возвращает логическое значение true,
если все элементы в последовательности
удовлетворяют условию, задаваемому параметром
Any(
Возвращает логическое значение true, если
любой элемент в последовательности удовлетворяет
условию, задаваемому параметром
Average()
Возвращает среднее всех значений в числовой
последовательности
Contains
Возвращает логическое значение true, если
в последовательности содержится указанный объект
Count()
Возвращает длину последовательности, т.е.
количество составляющих ее элементов
First()
Возвращает первый элемент в последовательности
Last()
Возвращает последний элемент в последовательности
Max()
Возвращает максимальное значение в
последовательности
Min()
Возвращает минимальное значение в
последовательности
Sum()
Возвращает сумму значений в числовой
последовательности
Метод Count()
уже демонстрировался ранее в этой главе. А в следующей программе демонстрируются остальные методы расширения, связанные с запросами.
// Использовать ряд методов расширения, определенных в классе Enumerable.
using System;
using System.Linq;
class ExtMethods {
static void Main() {
int[] nums = { 3, 1, 2, 5, 4 };
Console.WriteLine("Минимальное значение равно " + nums.Min());
Console.WriteLine("Максимальное значение равно " + nums.Max());
Console.WriteLine("Первое значение равно " + nums.First());
Console.WriteLine("Последнее значение равно " + nums.Last());
Console.WriteLine("Суммарное значение равно " + nums.Sum());