Студопедия

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

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

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






Группирование результатов с помощью оператора group






Одним из самых эффективных средств формирования запроса является оператор group, поскольку он позволяет группировать полученные результаты по ключам. Ис­ пользуя последовательность сгруппированных результатов, можно без особого тру­ да получить доступ ко всем данным, связанным с ключом. Благодаря этому свойству оператора group доступ к данным, организованным в последовательности связанных элементов, осуществляется просто и эффективно. Оператор group является одним из двух операторов, которыми может оканчиваться запрос. (Вторым оператором, завер­ шающим запрос, является select.) Ниже приведена общая форма оператора group.

group переменная_диапазона by ключ

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

Результатом выполнения оператора group является последовательность, состоя­ щая из элементов типа IGrouping< TKey, TElement>, т.е. обобщенного интерфейса, объявляемого в пространстве имен System.Linq. В этом интерфейсе определена кол­ лекция объектов с общим ключом. Типом переменной запроса, возвращающего груп­ пу, являетсяIEnumerable< IGrouping< TKey, TElement> >. В интерфейсе IGrouping определено также доступное только для чтения свойство Key, возвращающее ключ, связанный с каждой коллекцией.

Ниже приведен пример, демонстрирующий применение оператора group. В коде этого примера сначала объявляется массив, содержащий список веб-сайтов, а затем формируется запрос, в котором этот список группируется по имени домена самого верхнего уровня, например.org или.com.

// Продемонстрировать применение оператора group.

using System;

using System.Linq;

 

class GroupDemo {

static void Main() {

string[] websites = { " hsNameA.com", " hsNameB.net", " hsNameC.net",

" hsNameD.com", " hsNameE.org", " hsNameF.org",

" hsNameG.tv", " hsNameH.net", " hsNameI.tv"

};

 

// Сформировать запрос на получение списка веб-сайтов,

// группируемых по имени домена самого верхнего уровня.

var webAddrs = from addr in websites

where addr.LastIndexOf('.')! = -1

group addr by addr.Substring(addr.LastIndexOf('.'));

 

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

foreach(var sites in webAddrs) {

Console.WriteLine(" Веб-сайты, сгруппированные " +

" по имени домена" + sites.Key);

foreach(var site in sites)

Console.WriteLine(" " + site);

 

Console.WriteLine();

}

}

}

Вот к какому результату приводит выполнение этого кода.

Веб-сайты, сгруппированные по имени домена.соm

hsNameA.com

hsNameD.com

 

Веб-сайты, сгруппированные по имени домена.net

hsNameB.net

hsNameC.net

hsNameH.net

 

Веб-сайты, сгруппированные по имени домена.org

hsNameE.org

hsNameF.org

 

Веб-сайты, сгруппированные по имени домена.tv

hsNameG.tv

hsNameI.tv

Как следует из приведенного выше результата, данные, получаемые по запросу, группируются по имени домена самого верхнего уровня в адресе веб-сайта. Обратите внимание на то, как это делается в операторе group из следующего запроса.

var webAddrs = from addr in websites

where addr.LastlndexOf('.')! = -1

group addr by addr.Substring(addr.LastIndexOf('.'));

Ключ в этом операторе создается с помощью методов LastIndexOf() и Substring(), определенных для данных типа string. (Эти методы упоминаются в главе 7, посвященной массивам и строкам. Вариант метода Substring(), исполь­ зуемый в данном примере, возвращает подстроку, начинающуюся с места, обозна­ чаемого индексом, и продолжающуюся до конца вызывающей строки.) Индекс по­ следней точки в адресе веб-сайта определяется с помощью метода LastIndexOf(). По этому индексу в методе Substring() создается оставшаяся часть строки, в ко­ торой содержится имя домена самого верхнего уровня. Обратите внимание на то, что в операторе where отсеиваются все строки, которые не содержат точку. Метод LastIndexOf() возвращает -1, если указанная подстрока не содержится в вызываю­ щей строке.

Последовательность результатов, получаемых при выполнении запроса, храняще­ гося в переменной webAddrs, представляет собой список групп, поэтому для доступа к каждому члену группы требуются два цикла foreach. Доступ к каждой группе осу­ ществляется во внешнем цикле, а члены внутри группы перечисляются во внутреннем цикле. Переменная шага внешнего цикла foreach должна быть экземпляром интер­ фейса IGrouping, совместимым с ключом и типом элемента данных. В рассматри­ ваемом здесь примере ключи и элементы данных относятся к типу string. Поэтому переменная sites шага внешнего цикла имеет тип IGrouping, а переменная site шага внутреннего цикла — тип string. Ради краткости данного примера обе переменные объявляются неявно, хотя их можно объявить и явным об­ разом, как показано ниже.

foreach(IGrouping< string, string> sites in webAddrs) {

Console.WriteLine(" Веб-сайты, сгруппированные " +

" по имени домена" + sites.Key);

foreach(string site in sites)

Console.WriteLine(" " + site);

Console.WriteLine();

}






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