C# 4.0 полное руководство - 2011
Шрифт:
// Использовать запрос для получения последовательности объектов // типа 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")
}; •
//
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);
В этом операторе создается новый объект типа EmailAddress, содержащий имя и адрес электронной почты, получаемые из объекта типа Contactlnfo, хранящегося в массиве contacts. Но самое главное, что новые объекты типа EmailAddress создаются в операторе select во время выполнения запроса.
Применение вложенных операторов from
Запрос может состоять из нескольких операторов-f г от, которые оказываются в этом случае вложенными. Такие операторы from находят применение в тех случаях, когда по запросу требуется получить данные из двух разных источников. Рассмотрим простой пример, в котором два вложенных оператора from используются в запросе для циклического обращения к элементам двух разных массивов символов. В итоге по такому запросу формируется последовательность результатов, содержащая все возможные комбинации двух наборов символов.
// Использовать два вложенных оператора from для составления списка // всех возможных сочетаний букв А, В и С с буквами X, Y и Z.
using System; using System.Linq;
// Этот класс содержит результат запроса, class ChrPair {
public char First;
public char Second;
public ChrPair(char c, char c2) {
First = c;
Second = c2;
}
}
class MultipleFroms { static void Main {
char[] chrs = { 'A', 1В', 'C' };
char[] chrs2 = { 'X', 1Y', 'Z' };
// В первом операторе from организуется циклическое обращение //к массиву символов chrs, а во втором операторе from —
// циклическое обращение к массиву символов chrs2. var pairs = from chi in chrs
from ch2 in chrs2
select new ChrPair(chl, ch2);
Console.WriteLine("Все сочетания букв ABC и XYZ: "); foreach(var p in pairs)
Console.WriteLine("{0} {1}", p.First, p.Second);
}
}
Выполнение этого кода приводит к следующему результату.
Все сочетания букв ABC и XYZ:
А X A Y A Z В X В Y В Z С X С Y С Z
Этот пример кода начинается с создания класса ChrPair, в котором содержатся результаты запроса. Затем в нем создаются два массива, chrs и chrs2, и, наконец, формируется следующий запрос для получения всех возможных комбинаций двух последовательностей результатов.
var pairs = from chi in chrs
from ch2 in chrs2
select new ChrPair(chi, ch2);
Во вложенных операторах from организуется циклическое обращение к обоим массивам символов, chrs и chrs2. Сначала из массива chrs получается символ, сохраняемый в переменной chi. Затем перечисляется содержимое массива chrs2. На каждом шаге циклического обращения во внутреннем операторе from символ из массива chrs2 сохраняется в переменной ch2 и далее выполняется оператор select. В результате выполнения оператора select создается новый объект типа ChrPair,