select new ChrPair(chi, ch2);
Во вложенных операторах from организуется циклическое обращение к обоим массивам символов, chrs и chrs2. Сначала из массива chrs получается символ, сохраняемый в переменной chi. Затем перечисляется содержимое массива chrs2. На каждом шаге циклического обращения во внутреннем операторе from символ из массива chrs2 сохраняется в переменной ch2 и далее выполняется оператор select. В результате выполнения оператора select создается новый объект типа ChrPair,
содержащий пару символов, которые сохраняются в переменных chi и ch2 на каждом шаге циклического обращения к массиву во внутреннем операторе from. А в конечном итоге получается объект типа ChrPair, содержащий все возможные сочетания извлекаемых символов.
Вложенные'операторы from применяются также для циклического обращения к источнику данных, который содержится в другом источнике данных. Соответствующий пример приведен в разделе 'Применение оператора let для создания временной переменной в запросе' далее в этой главе.
Группирование результатов с помощью оператора group
Одним из самых эффективных средств формирования запроса является оператор group, поскольку он позволяет группировать полученные результаты по ключам. Используя последовательность сгруппированных результатов, можно без особого труда получить доступ ко всем данным, связанным с ключом. Благодаря этому свойству оператора group доступ к данным, организованным в последовательности связанных элементов, осуществляется просто и эффективно. Оператор group является одним из двух операторов, которыми может оканчиваться запрос. (Вторым оператором, завершающим запрос, является select.) Ниже приведена общая форма оператора group.
group
Этот оператор возвращает данные, сгруппированные в последовательности, причем каждую последовательность обозначает общий
Результатом выполнения оператора group является последовательность, состоящая из элементов типа IGrouping<TKey, TElement>, т.е. обобщенного интерфейса, объявляемого в пространстве имен System. Linq. В этом интерфейсе определена коллекция объектов с общим ключом. Типом переменной запроса, возвращающего группу, является IEnumerable<IGrouping<TKey, TElement>>. В интерфейсе IGrouping определено также доступное только для чтения свойство Key, возвращающее ключ, связанный с каждой коллекцией.
Ниже приведен пример, демонстрирующий применение оператора group. В коде этого примера сначала объявляется массив, содержащий список веб-сайтов, а затем формируется запрос, в котором этот список группируется по имени домена самого верхнего уровня, например . org или . сот.
// Продемонстрировать применение оператора 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', 'hsNamel.tv'
};
// Сформировать запрос на получение списка веб-сайтов,
// группируемых по имени домена самого верхнего уровня.
var webAddrs = from addr in websites
where addr.LastlndexOf('.') != -1
group addr by addr.Substring(addr.LastlndexOf('.'));
// Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {
Console.WriteLine('Веб-сайты, сгруппированные ' +
'по имени домена' + sites.Key); foreach(var site in sites)
Console.WriteLine (' ' + site);
Console.WriteLine();
}
}
}
Вот к какому результату приводит выполнение этого кода.
