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

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

<b>class Transport {</b>

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

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

<b>  public Transport(string n, string h) {</b>

<b>    Name = n;</b>

<b>    How = h;</b>

<b>  }</b>

<b>}</b>

<b>class GroupJoinDemo {</b>

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

<b>    // Массив классификации видов транспорта,</b>

<b>    string[] travelTypes = {</b>

<b>      &quot;Воздушный&quot;,</b>

<b>      &quot;Морской&quot;,</b>

<b>      &quot;Наземный&quot;,</b>

<b>      &quot;Речной&quot;,</b>

<b>    };</b>

<b>    // Массив видов транспорта.</b>

<b>    Transport[] transports = {</b>

<b>      new Transport(&quot;велосипед&quot;, &quot;Наземный&quot;),</b>

<b>      new Transport (&quot;аэростат&quot;, &quot;Воздушный&quot;),</b>

<b>      new Transport(&quot;лодка&quot;, &quot;Речной&quot;),</b>

<b>      new Transport(&quot;самолет&quot;, &quot;Воздушный&quot;),</b>

<b>      new Transport(&quot;каноэ&quot;, &quot;Речной&quot;),</b>

<b>      new Transport(&quot;биплан&quot;, &quot;Воздушный&quot;),</b>

<b>      new Transport(&quot;автомашина&quot;, &quot;Наземный&quot;),</b>

<b>      new Transport(&quot;судно&quot;, &quot;Морской&quot;),</b>

<b>      new Transport(&quot;поезд&quot;, &quot;Наземный&quot;)</b>

<b>    };</b>

<b>    // Сформировать запрос, в котором групповое</b>

<b>    // объединение используется для составления списка</b>

<b>    // видов транспорта по соответствующим категориям,</b>

<b>    var byHow = from how in travelTypes</b>

<b>             join trans in transports </b>

<b>               on how equals trans.How</b>

<b>             into lst</b>

<b>             select new { How = how, Tlist = lst };</b>

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

<b>    foreach(var t in byHow) {</b>

<b>      Console.WriteLine(&quot;К категории &lt;{0} транспорт&gt; относится:&quot;, t.How);</b>

<b>      foreach(var m in t.Tlist)</b>

<b>        Console.WriteLine(&quot; &quot; + m.Name);</b>

<b>      Console.WriteLine();</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Ниже приведен результат выполнения этой программы.

<b>К категории &lt;Воздушный транспорт&gt; относится:</b>

<b> аэростат</b>

<b> самолет</b>

<b> биплан</b>

<b>К категории &lt;Морской транспорт&gt; относится:</b>

<b> судно</b>

<b>К категории &lt;Наземный транспорт&gt; относится:</b>

<b> велосипед</b>

<b> автомашина</b>

<b> поезд</b>

<b>К категории &lt;Речной транспорт&gt;</b><b> относится:</b>

<b> лодка</b>

<b> каноэ</b>

Главной частью данной программы, безусловно, является следующий запрос.

<b>var byHow = from how in travelTypes</b>

<b>     join trans in transports</b>

<b>       on how equals trans.How</b>

<b>     into 1st</b>

<b>     select new { How = how, Tlist = 1st };</b>

Этот запрос формируется следующим образом. В операторе from используется переменная диапазона how для охвата всего массива travelTypes. Напомним, что массив travelTypes содержит названия общих категорий транспорта: воздушного, наземного, морского и речного. Каждый вид транспорта объединяется в операторе join со своей категорией. Например, велосипед, автомашина и поезд объединяются с наземным транспортом. Но благодаря оператору into для каждой категории транспорта в операторе join составляется список видов транспорта, относящихся к данной категории. Этот список сохраняется в переменной lst. И наконец, оператор select возвращает объект анонимного типа, инкапсулирующий каждое значение переменной how (категории транспорта) вместе со списком видов транспорта. Именно поэтому для вывода результатов запроса требуются два цикла foreach.