Страница 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> "Воздушный",</b>
<b> "Морской",</b>
<b> "Наземный",</b>
<b> "Речной",</b>
<b> };</b>
<b> // Массив видов транспорта.</b>
<b> Transport[] transports = {</b>
<b> new Transport("велосипед", "Наземный"),</b>
<b> new Transport ("аэростат", "Воздушный"),</b>
<b> new Transport("лодка", "Речной"),</b>
<b> new Transport("самолет", "Воздушный"),</b>
<b> new Transport("каноэ", "Речной"),</b>
<b> new Transport("биплан", "Воздушный"),</b>
<b> new Transport("автомашина", "Наземный"),</b>
<b> new Transport("судно", "Морской"),</b>
<b> new Transport("поезд", "Наземный")</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("К категории <{0} транспорт> относится:", t.How);</b>
<b> foreach(var m in t.Tlist)</b>
<b> Console.WriteLine(" " + m.Name);</b>
<b> Console.WriteLine();</b>
<b> }</b>
<b> }</b>
<b>}</b>
Ниже приведен результат выполнения этой программы.
<b>К категории <Воздушный транспорт> относится:</b>
<b> аэростат</b>
<b> самолет</b>
<b> биплан</b>
<b>К категории <Морской транспорт> относится:</b>
<b> судно</b>
<b>К категории <Наземный транспорт> относится:</b>
<b> велосипед</b>
<b> автомашина</b>
<b> поезд</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 1st</b>
<b> select new { How = how, Tlist = 1st };</b>
Этот запрос формируется следующим образом. В операторе from используется переменная диапазона how для охвата всего массива travelTypes. Напомним, что массив travelTypes содержит названия общих категорий транспорта: воздушного, наземного, морского и речного. Каждый вид транспорта объединяется в операторе join со своей категорией. Например, велосипед, автомашина и поезд объединяются с наземным транспортом. Но благодаря оператору into для каждой категории транспорта в операторе join составляется список видов транспорта, относящихся к данной категории. Этот список сохраняется в переменной lst. И наконец, оператор select возвращает объект анонимного типа, инкапсулирующий каждое значение переменной how (категории транспорта) вместе со списком видов транспорта. Именно поэтому для вывода результатов запроса требуются два цикла foreach.