Страница 322 из 502
<b>}</b>
Эта версия программы дает такой же результат, как и предыдущая. Единственное отличие между ними заключается в том, как формируется запрос. В данной версии для этой цели используются методы запроса.
Рассмотрим другой пример. Но сначала приведем еще раз запрос из представленного ранее примера применения оператора join.
<b>var inStockList = from item in items</b>
<b> join entry in statusList</b>
<b> on item.ItemNumber equals entry.ItemNumber </b>
<b> select new Temp(item.Name, entry.InStock);</b>
По этому запросу формируется последовательность, состоящая из объектов, инкапсулирующих наименование товара и состояние его запасов на складе. Вся эта информация получается путем объединения двух источников данных: items и statusList. Ниже приведен переделанный вариант данного запроса, в котором вместо синтаксиса, предусмотренного в C# для запросов, используется метод запроса Join().
<b>// Использовать метод запроса Join() для составления списка</b>
<b>// наименований товаров и состояния их запасов на складе,</b>
<b>var inStockList = items.Join(statusList,</b>
<b> kl => kl.ItemNumber,</b>
<b> k2 => k2.ItemNumber,</b>
<b> (kl, k2) => new Temp(kl.Name, k2.InStock) );</b>
В данном варианте именованный класс Temp используется для хранения результирующего объекта, но вместо него можно воспользоваться анонимным типом. Такой вариант запроса приведен ниже.
<b>var inStockList = items.Join(statusList,</b>
<b> kl => kl.ItemNumber,</b>
<b> k2 => k2.ItemNumber,</b>
<b> (kl, k2) => new { kl.Name, k2.InStock} );</b>
Как пояснялось в предыдущем разделе, запросы в C# можно формировать двумя способами, используя синтаксис запросов или методы запроса. Любопытно, что оба способа связаны друг с другом более тесно, чем кажется, глядя на исходный код программы. Дело в том, что синтаксис запросов компилируется в вызовы методов запроса. Поэтому код
<b>where х < 10</b>
будет преобразован компилятором в следующий вызов.
<b>Where(х => х < 10)</b>
Таким образом, оба способа формирования запросов в конечном итоге сходятся на одном и том же.
Но если оба способа оказываются в конечном счете равноценными, то какой из них лучше для программирования на С#? В целом, рекомендуется чаще пользоваться синтаксисом запросов, поскольку он полностью интегрирован в язык С#, поддерживается соответствующими ключевыми словами и синтаксическим конструкциями.
Помимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable<T> в классе Enumerable. Ниже приведены наиболее часто используемые методы расширения, связанные с запросами. Многие из них могут перегружаться, поэтому они представлены лишь в самой общей форме.
<b>Метод </b><b>Описание</b>
<b>All(<i>predicate) </i></b><b>Возвращает логическое значение true,</b>
<b> если все элементы в последовательности</b>
<b> удовлетворяют условию, задаваемому параметром</b>
<i><b> predicate</b></i>
<b>Any(<i>predicate) </i></b><b>Возвращает логическое значение true, если</b>
<b> любой элемент в последовательности удовлетворяет</b>
<b> условию, задаваемому параметром </b><i><b>predicate</b></i>
<b>Average() </b><b>Возвращает среднее всех значений в числовой</b>
<b> последовательности</b>
<b>Contains<i>(value) </i></b><b>Возвращает логическое значение true, если</b>
<b> в последовательности содержится указанный объект</b>
<b>Count() </b><b>Возвращает длину последовательности, т.е.</b>
<b> количество составляющих ее элементов</b>
<b>First() </b><b>Возвращает первый элемент в последовательности</b>
<b>Last() </b><b>Возвращает последний элемент в последовательности</b>
<b>Max() </b><b>Возвращает максимальное значение в</b>
<b> последовательности</b>
<b>Min() </b><b>Возвращает минимальное значение в</b>