Чтение онлайн

на главную

Жанры

Полное руководство. С# 4.0
Шрифт:

Вот к какому результату приводит выполнение этого кода. Веб-сайты, сгруппированные по имени домена .со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; } Продолжение запроса с помощью оператора into

При использовании в запросе оператора select или group иногда требуется сфор мировать временный результат, который будет служить продолжением запроса для по лучения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена об щая форма оператора into: into имя тело_запроса

где имя обозначает конкретное имя переменной диапазона, используемой для ци клического обращения к временному результату в продолжении запроса, на которое указывает тело_запроса. Когда оператор into используется вместе с оператором select или group, то его называют продолжением запроса, поскольку он продолжает запрос. По существу, продолжение запроса воплощает в себе принцип построения нового запроса по результатам предыдущего.

ПРИМЕЧАНИЕ Существует также форма оператора into, предназначенная для использования вместе с оператором join, создающим групповое объединение, о котором речь пойдет далее в этой главе.

Ниже приведен пример программы, в которой оператор into используется вместе с оператором group. Эта программа является переработанным вариантом предыду щего примера, в котором список веб-сайтов формируется по имени домена самого верхнего уровня. А в данном примере первоначальные результаты запроса сохраня ются в переменной диапазона ws и затем отбираются для исключения всех групп, со стоящих менее чем из трех элементов. // Использовать оператор into вместе с оператором group. using System; using System.Linq; class IntoDemo { static void Main { string[] websites = { "hsNameA.com", "hsNameB.net", "hsNameC.net", "hsNameD.com", "hsNameE.org", "hsNameF.org", "hsNameG.tv", "hsNameH.net", "hsNameI.tv" }; // Сформировать запрос на получение списка веб-сайтов, группируемых // по имени домена самого верхнего уровня, но выбрать только те // группы, которые состоят более чем из двух членов. // Здесь ws — это переменная диапазона для ряда групп, // возвращаемых при выполнении первой половины запроса. var webAddrs = from addr in websites where addr.LastIndexOf('.') != -1 group addr by addr.Substring(addr.LastIndexOf('.')) into ws where ws.Count > 2 select ws; // Выполнить запрос и вывести его результаты. Console.WriteLine("Домены самого верхнего уровня " + "с более чем двумя членами.\n"); foreach(var sites in webAddrs) { Console.WriteLine("Содержимое домена: " + sites.Key); foreach(var site in sites) Console.WriteLine(" " + site); Console.WriteLine; } } }

Эта программа дает следующий результат: Домены самого верхнего уровня с более чем двумя членами. Содержимое домена: .net hsNameB.net hsNameC.net hsNameH.net

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

Обратите особое внимание в данном примере программы на следующую последо вательность операторов в формируемом запросе. group addr by addr.Substring(addr.LastIndexOf('.')) into ws where ws.Count >2 select ws;

Сначала результаты выполнения оператора group сохраняются как временные для последующей обработки оператором where. В качестве переменной диапазона в данный момент служит переменная ws. Она охватывает все группы, возвращаемые оператором group. Затем результаты запроса отбираются в операторе where с таким расчетом, чтобы в конечном итоге остались только те группы, которые содержат боль ше двух членов. Для этой цели вызывается метод Count, который является мето дом расширения и реализуется для всех объектов типа IEnumerable. Он возвращает количество элементов в последовательности. (Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге последовательность групп возвра щается оператором select. Применение оператора let для создания временной переменной в запросе

Иногда возникает потребность временно сохранить некоторое значение в самом запросе. Допустим, что требуется создать переменную перечислимого типа, которую можно будет затем запросить, или же сохранить некоторое значение, чтобы в даль нейшем использовать его в операторе where. Независимо от преследуемой цели, эти виды функций могут быть осуществлены с помощью оператора let. Ниже приведена общая форма оператора let: let имя = выражение

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

В приведенном ниже примере программы демонстрируется применение операто ра let для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа char. Для этой цели служит еще один метод обработки строк, называе мый ToCharArray и возвращающий массив, содержащий символы в строке. Полу ченный результат присваивается переменной chrArray, которая затем используется во вложенном операторе from для извлечения отдельных символов из массива. И на конец, полученные символы сортируются в запросе, и из них формируется результи рующая последовательность. // Использовать оператор let в месте с вложенным оператором from. using System; using System.Linq; class LetDemo { static void Main { string[] strs = ( "alpha", "beta", "gamma" }; // Сформировать запрос на получение символов, возвращаемых из // строк в отсортированной последовательности. Обратите внимание // на применение вложенного оператора from. var chrs = from str in strs let chrArray = str.ToCharArray from ch in chrArray orderby ch select ch; Console.WriteLine("Отдельные символы, отсортированные по порядку:"); // Выполнить запрос и вывести его результаты. foreach(char с in chrs) Console.Write(с + " "); Console.WriteLine; } }

Вот к какому результату приводит выполнение этой программы. Отдельные символы, отсортированные по порядку: a a a a a b e g h l m m p t

Обратите внимание в данном примере программы на то, что в операторе let пе ременной chrArray присваивается ссылка на массив, возвращаемый методом str. ToCharArray. let chrArray = str.ToCharArray

После оператора let переменная chrArray может использоваться в остальных операторах, составляющих запрос. А поскольку все массивы в C# преобразуются в тип IEnumerable<T>, то переменную chrArray можно использовать в качестве источника данных для запроса во втором, вложенном операторе from. Именно это и происходит в рассматриваемом здесь примере, где вложенный оператор from служит для пере числения в массиве отдельных символов, которые затем сортируются по нарастающей и возвращаются в виде конечного результата.

Поделиться:
Популярные книги

Мастер 6

Чащин Валерий
6. Мастер
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Волк: лихие 90-е

Киров Никита
1. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк: лихие 90-е

Таблеточку, Ваше Темнейшество?

Алая Лира
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Таблеточку, Ваше Темнейшество?

Огни Аль-Тура. Желанная

Макушева Магда
3. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.25
рейтинг книги
Огни Аль-Тура. Желанная

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Раб и солдат

Greko
1. Штык и кинжал
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Раб и солдат

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец

Титан империи 7

Артемов Александр Александрович
7. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Титан империи 7

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

Сын Петра. Том 1. Бесенок

Ланцов Михаил Алексеевич
1. Сын Петра
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Сын Петра. Том 1. Бесенок

Последний попаданец 5

Зубов Константин
5. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 5