Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создание группового объединения






Как пояснялось ранее, оператор into можно использовать вместе с оператором join для создания группового объединения, образующего последовательность, в которой каждый результат состоит из элементов данных из первой последовательности и груп­ пы всех совпадающих элементов из второй последовательности. Примеры группового объединения не приводились выше потому, что в этом объединении нередко приме­ няется анонимный тип. Но теперь, когда представлены анонимные типы, можно об­ ратиться к простому примеру группового объединения.

В приведенном ниже примере программы групповое объединение используется для составления списка, в котором различные транспортные средства (автомашины, суда и самолеты) организованы по общим для них категориям транспорта: назем­ ного, морского, воздушного и речного. В этой программе сначала создается класс Transport, связывающий вид транспорта с его классификацией. Затем в методе Main() формируются две входные последовательности. Первая из них представля­ ет собой массив символьных строк, содержащих названия общих категорий транс­ порта: наземного, морского, воздушного и речного, а вторая — массив объектов типа Transport, инкапсулирующих различные транспортные средства. Полученное в итоге групповое объединение используется для составления списка транспортных средств, организованных по соответствующим категориям.

// Продемонстрировать применение простого группового объединения.

using System;

using System.Linq;

 

// Этот класс связывает наименование вида транспорта,

// например поезда, с общей классификацией транспорта:

// наземного, морского, воздушного или речного.

class Transport {

public string Name { get; set; }

public string How { get; set; }

 

public Transport(string n, string h) {

Name = n;

How = h;

}

}

 

class GroupJoinDemo {

static void Main() {

// Массив классификации видов транспорта.

string[] travelTypes = {

" Воздушный",

" Морской",

" Наземный",

" Речной",

};

 

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

Transport[] transports = {

new Transport(" велосипед", " Наземный"),

new Transport(" аэростат", " Воздушный"),

new Transport(" лодка", " Речной"),

new Transport(" самолет", " Воздушный"),

new Transport(" каноэ", " Речной"),

new Transport(" биплан", " Воздушный"),

new Transport(" автомашина", " Наземный"),

new Transport(" судно", " Морской"),

new Transport(" поезд", " Наземный")

};

 

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

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

// видов транспорта по соответствующим категориям.

var byHow = from how in travelTypes

join trans in transports

on how equals trans.How

into lst

select new { How = how, Tlist = lst };

 

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

foreach(var t in byHow) {

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

 

foreach(var m in t.Tlist)

Console.WriteLine(" " + m.Name);

 

Console.WriteLine();

}

}

}

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

К категории < Воздушный транспорт> относится:

аэростат

самолет

биплан

 

К категории < Морской транспорт> относится:

судно

 

К категории < Наземный транспорт> относится:

велосипед

автомашина

поезд

 

К категории < Речной транспорт> относится:

лодка

каноэ

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

var byHow = from how in travelTypes

join trans in transports

on how equals trans.How

into lst

select new { How = how, Tlist = lst };

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

foreach(var t in byHow) {

Console.WrifeLine(" К категории < {0} транспорт> относится: ", t.How);

 

foreach(var m in t.Tlist)

Console.WriteLine(" " + m.Name);

 

Console.WriteLine();

}

Во внешнем цикле получается объект, содержащий наименование общей катего­ рии транспорта, и список видов транспорта, относящихся к этой категории. А во вну­ треннем цикле выводятся отдельные виды транспорта.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.