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 ()

Возвращает сумму значений в числовой последовательности

Метод Count () уже демонстрировался ранее в этой главе. А в следующей программе демонстрируются остальные методы расширения, связанные с запросами.

// Использовать ряд методов расширения, определенных в классе Enumerable.

using System; using System.Linq;

class ExtMethods { static void Main() {

int[] nums = { 3, 1, 2, 5, 4 };

Console .WriteLine ('Минимальное значение равно ' + nums.MinO);

Console.WriteLine('Максимальное значение равно ' + nums.Max());

Console.WriteLine('Первое значение равно ' + nums.First());

Console.WriteLine('Последнее значение равно ' + nums.Last());

Console.WriteLine('Суммарное значение равно ' + nums.SumO);

Console.WriteLine('Среднее значение равно ' + nums.Average());

if(nums.All(n => n > 0))

Console.WriteLine('Все значения больше нуля.');

if(nums.Any(n => (n % 2) == 0))

Console.WriteLine('По крайней мере одно значение является четным.');

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату