C# 4.0 полное руководство - 2011
Шрифт:
Console.WriteLine("{0:#.##}", r);
}
}
Эта программа дает следующий результат.
Квадратные корни положительных значений, округленные до двух десятичных цифр:
4.05
3.48
10.04
5.02
Обратите особое внимание в данном примере запроса на следующий оператор select.
select Math.Sqrt(n);
Он возвращает квадратный
Ниже приведена программа, демонстрирующая другое применение оператора select. В этой программе сначала создается класс EmailAddress, содержащий два свойства. В первом из них хранится имя адресата, а во втором — адрес его электронной почты. Затем в этой программе создается массив, содержащий несколько элементов данных типа EmailAddress. И наконец, в данной программе создается список, состоящий только из адресов электронной почты, извлекаемых по запросу.
// Возвратить часть значения переменной диапазона.
using System; using System.Linq;
class EmailAddress {
public string Name { get; set; } public string Address { get; set; }
public EmailAddress(string n, string a) {
Name = n;
Address = a;
}
}
class SelectDemo2 { static void Main {
EmailAddress[] addrs = { new EmailAddress("Герберт", "[email protected]"), new EmailAddress("Tom", "[email protected]"), new EmailAddress("Capa", "[email protected]")
};
// Сформировать запрос на получение адресов
// электронной почты.
var eAddrs = from entry in addrs
select entry.Address;
Console.WriteLine("Адреса электронной почты:");
// Выполнить запрос и вывести его результаты, foreach(string s in eAddrs)
Console.WriteLine(" " + s);
}
}
Вот к какому результату приводит выполнение этой программы.
Адреса электронной почты:
[email protected] [email protected]
Обратите особое внимание на следующий оператор select, select entry.Address;
Вместо полного значения переменной диапазона этот оператор возвращает лишь его адресную часть (Address). Это означает, что по данному запросу возвращается последовательность символьных строк, а не объектов типа Email Address. Именно
Одной из самых эффективных для оператора 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("Герберт", "[email protected]", "555-1010"), new Contactlnfo("Том", "[email protected]", "555-1101"), new Contactlnfo("Capa", "[email protected]", "555-0110")
}; •
// Сформировать запрос на получение списка объектов типа EmailAddress. var emailList = from entry in contacts
select new EmailAddress(entry.Name, entry.Email);