Страница 311 из 502
<b>// Использовать запрос для получения последовательности объектов</b>
<b>// типа EmailAddresses из списка объектов типа ContactInfo.</b>
<b>using System;</b>
<b>using System.Linq;</b>
<b>class ContactInfo {</b>
<b> public string Name { get; set; }</b>
<b> public string Email { get; set; }</b>
<b> public string Phone { get; set; }</b>
<b> public ContactInfo(string n, string a, string p) {</b>
<b> Name = n;</b>
<b> Email = a;</b>
<b> Phone = p;</b>
<b> }</b>
<b>}</b>
<b>class EmailAddress {</b>
<b> public string Name { get; set; }</b>
<b> public string Address { get; set; }</b>
<b> public EmailAddress(string n, string a) {</b>
<b> Name = n;</b>
<b> Address = a;</b>
<b> }</b>
<b>}</b>
<b>class SelectDemo3 {</b>
<b> static void Main() {</b>
<b> ContactInfo[] contacts = {</b>
<b> new ContactInfo("Герберт", "[email protected]/* */", "555-1010"),</b>
<b> new ContactInfo("Том", "[email protected]/* */", "555-1101"),</b>
<b> new ContactInfo("Capa", "[email protected]/* */", "555-0110")</b>
<b> };</b>
<b> // Сформировать запрос на получение</b>
<b> // списка объектов типа EmailAddress.</b>
<b> var emailList = from entry in contacts</b>
<b> select new EmailAddress(entry.Name, entry.Email);</b>
<b> Console.WriteLine("Список адресов электронной почты:");</b>
<b> // Выполнить запрос и вывести его результаты,</b>
<b> foreach(EmailAddress e in emailList)</b>
<b> Console.WriteLine(" {0}: {1}", e.Name, e.Address );</b>
<b> }</b>
<b>}</b>
Ниже приведен результат выполнения этой программы.
<b>Список адресов электронной почты:</b>
<b>Герберт: [email protected]/* */ </b>
<b>Том: [email protected]/* */ </b>
<b>Сара: [email protected]/* */</b>
Обратите особое внимание в данном запросе на следующий оператор select.
<b>select new EmailAddress(entry.Name, entry.Email);</b>
В этом операторе создается новый объект типа EmailAddress, содержащий имя и адрес электронной почты, получаемые из объекта типа ContactInfo, хранящегося в массиве contacts. Но самое главное, что новые объекты типа EmailAddress создаются в операторе select во время выполнения запроса.
Применение вложенных операторов from
Запрос может состоять из нескольких операторов fгom от, которые оказываются в этом случае вложенными. Такие операторы from находят применение в тех случаях, когда по запросу требуется получить данные из двух разных источников. Рассмотрим простой пример, в котором два вложенных оператора from используются в запросе для циклического обращения к элементам двух разных массивов символов. В итоге по такому запросу формируется последовательность результатов, содержащая все возможные комбинации двух наборов символов.
<b>// Использовать два вложенных оператора from для составления списка</b>
<b>// всех возможных сочетаний букв А, В и С с буквами X, Y и Z.</b>
<b>using System;</b>
<b>using System.Linq;</b>
<b>// Этот класс содержит результат запроса,</b>
<b>class ChrPair {</b>
<b> public char First;</b>
<b> public char Second;</b>
<b> public ChrPair(char c, char c2) {</b>
<b> First = c;</b>
<b> Second = c2;</b>
<b> }</b>
<b>}</b>
<b>class MultipleFroms {</b>
<b> static void Main() {</b>
<b> char[] chrs = { 'A', 'В', 'C' };</b>
<b> char[] chrs2 = { 'X', 'Y', 'Z' };</b>