Добавить в цитаты Настройки чтения

Страница 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 =&gt; kl.ItemNumber,</b>

<b>                             k2 =&gt; k2.ItemNumber,</b>

<b>                        (kl, k2) =&gt; new Temp(kl.Name, k2.InStock) );</b>

В данном варианте именованный класс Temp используется для хранения результирующего объекта, но вместо него можно воспользоваться анонимным типом. Такой вариант запроса приведен ниже.

<b>var inStockList = items.Join(statusList,</b>

<b>                            kl =&gt; kl.ItemNumber,</b>

<b>                            k2 =&gt; k2.ItemNumber,</b>

<b>                        (kl, k2) =&gt; new { kl.Name, k2.InStock} );</b>

Как пояснялось в предыдущем разделе, запросы в C# можно формировать двумя способами, используя синтаксис запросов или методы запроса. Любопытно, что оба способа связаны друг с другом более тесно, чем кажется, глядя на исходный код программы. Дело в том, что синтаксис запросов компилируется в вызовы методов запроса. Поэтому код

<b>where х &lt; 10</b>

будет преобразован компилятором в следующий вызов.

<b>Where(х =&gt; х &lt; 10)</b>

Таким образом, оба способа формирования запросов в конечном итоге сходятся на одном и том же.

Но если оба способа оказываются в конечном счете равноценными, то какой из них лучше для программирования на С#? В целом, рекомендуется чаще пользоваться синтаксисом запросов, поскольку он полностью интегрирован в язык С#, поддерживается соответствующими ключевыми словами и синтаксическим конструкциями.

Помимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable&lt;T&gt; в классе 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>