Одной из самых эффективных для оператораselectявляется возможность возвращать последовательность результатов, содержащую элементы данных, формируемые во время выполнения запроса. В качестве примера рассмотрим еще одну программу. В ней определяется классContactlnfo,в котором хранится имя, адрес электронной почты и номер телефона адресата. Кроме того, в этой программе определяется классEmail Addr ess,использовавшийся в предыдущем примере. В методеMain создается массив объектов типаContactlnfo,а затем объявляется запрос, в котором источником данных служит этот массив, но возвращаемая последовательность результатов содержит объекты типаEmailAddress.Таким образом, типом последовательности результатов, возвращаемой операторомselect,является классEmailAddress,а не классContactlnfo,причем его объекты создаются во время выполнения запроса.
// Использовать запрос для получения последовательности объектов // типа EmailAddresses из списка объектов типа Contactlnfo.
using System; using System.Linq;
class Contactlnfo {
public string Name { get; set; } public string Email { get; set; }
public string Phone { get; set; }
public Contactlnfo(string n, string a, string p) {
Name = n;
Email = a;
Phone = p;
}
}
class EmailAddress {
public string Name { get; set; } public string Address { get; set; } public EmailAddress(string n, string a) {
Name = n;
Address = a;
} -
}
class SelectDemo3 { static void Main {
Contactlnfo[] contacts = {
new Contactlnfo("Герберт", "Herb@HerbSchildt.com", "555-1010"), new Contactlnfo("Том", "Tom@HerbSchildt.com", "555-1101"), new Contactlnfo("Capa", "Sara@HerbSchildt.com", "555-0110")
}; •
// Сформировать запрос на получение списка объектов типа EmailAddress. var emailList = from entry in contacts
select new EmailAddress(entry.Name, entry.Email);
Console.WriteLine("Список адресов электронной почты:");
// Выполнить запрос и вывести его результаты, foreach(EmailAddress е in emailList)
Console.WriteLine(" {0}: {1}", e.Name, e.Address );
}
}
Ниже приведен результат выполнения этой программы.
• Список адресов электронной почты:
Герберт:Herb@HerbSchildt.comТом:Tom@HerbSchildt.comСара:Sara@HerbSchildt.com
Обратите особое внимание в данном запросе на следующий операторselect.
select new EmailAddress(entry.Name, entry.Email);