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

Страница 316 из 502

<b>// Продемонстрировать применение оператора join.</b>

<b>using System;</b>

<b>using System.Linq;</b>

<b>// Класс, связывающий наименование товара с его порядковым номером,</b>

<b>class Item {</b>

<b>  public string Name { get; set; }</b>

<b>  public int ItemNumber { get; set; }</b>

<b>  public Item(string n, int inum) {</b>

<b>    Name = n;</b>

<b>    ItemNumber = inum;</b>

<b>  }</b>

<b>}</b>

<b>// Класс, связывающий наименование товара</b>

<b>// с состоянием его запасов на складе,</b>

<b>class InStockStatus {</b>

<b>  public int ItemNumber { get; set; }</b>

<b>  public bool InStock { get; set; }</b>

<b>  public InStockStatus (int n, bool b) {</b>

<b>    ItemNumber = n;</b>

<b>    InStock = b;</b>

<b>  }</b>

<b>}</b>

<b>// Класс, инкапсулирующий наименование товара и</b>

<b>// состояние его запасов на складе,</b>

<b>class Temp {</b>

<b>  public string Name { get; set; }</b>

<b>  public bool InStock { get; set; }</b>

<b>  public Temp(string n, bool b) {</b>

<b>    Name = n;</b>

<b>    InStock = b;</b>

<b>  }</b>

<b>}</b>

<b>class JoinDemo {</b>

<b>  static void Main() {</b>

<b>    Item[] items = {</b>

<b>      new Item(&quot;Кусачки&quot;, 1424), new Item(&quot;Тиски&quot;, 7892),</b>

<b>      new Item(&quot;Молоток&quot;, 8534), new Item(&quot;Пила&quot;, 6411)</b>

<b>    };</b>

<b>    InStockStatus[] statusList = {</b>

<b>      new InStockStatus(1424, true),</b>

<b>      new InStockStatus(7892, false),</b>

<b>      new InStockStatus(8534, true),</b>

<b>      new InStockStatus(6411, true)</b>

<b>    };</b>

<b>    // Сформировать запрос, объединяющий объекты классов Item</b>

<b>    //и InStockStatus для составления списка наименований товаров</b>

<b>    // и их наличия на складе. Обратите внимание на формирование</b>

<b>    // последовательности объектов класса Temp,</b>

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

<b>    Console.WriteLine(&quot;ТоварtНаличиеn&quot;);</b>

<b>    // Выполнить запрос и вывести его результаты.</b>

<b>    foreach(Temp t in inStockList)</b>

<b>      Console.WriteLine(&quot;{0}t{1}&quot;, t.Name, t.InStock);</b>

<b>  }</b>

<b>}</b>

Эта программа дает следующий результат

<b>Товар    Наличие</b>

<b>Кусачки  True</b>

<b>Тиски    False</b>

<b>Молоток  True</b>

<b>Пила     True</b>

Для того чтобы стал понятнее принцип действия оператора join, рассмотрим каждую строку запроса из приведенной выше программы по порядку. Этот запрос начинается, как обычно, со следующего оператора from.

<b>var inStockList = from item in items</b>

В этом операторе указывается переменная диапазона item для источника данных items, который представляет собой массив объектов класса Item. В классе Item инкапсулируются наименование товара и порядковый номер товара, хранящегося на складе.

Далее следует приведенный ниже оператор join.

<b>join entry in statusList</b>

<b>  on item.ItemNumber equals entry.ItemNumber</b>

В этом операторе указывается переменная диапазона entry для источника данных statusList, который представляет собой массив объектов класса InStockStatus, связывающего порядковый номер товара с состоянием его запасов на складе. Следовательно, у массивов items и statusList имеется общее свойство: порядковый номер товара. Именно это свойство используется в части on/equals оператора join для описания связи, по которой из двух разных источников данных выбираются наименования товаров, когда их порядковые номера совпадают.