Добавить в цитаты Настройки чтения

Страница 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(&quot;Герберт&quot;, &quot;[email protected]/* */&quot;, &quot;555-1010&quot;),</b>

<b>      new ContactInfo(&quot;Том&quot;, &quot;[email protected]/* */&quot;, &quot;555-1101&quot;),</b>

<b>      new ContactInfo(&quot;Capa&quot;, &quot;[email protected]/* */&quot;, &quot;555-0110&quot;)</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(&quot;Список адресов электронной почты:&quot;);</b>

<b>    // Выполнить запрос и вывести его результаты,</b>

<b>    foreach(EmailAddress e in emailList)</b>

<b>      Console.WriteLine(&quot; {0}: {1}&quot;, 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>