26) var acclnfo = from асс in accounts orderby acc.LastName, acc.FirstName, acc.Balance select acc; 27) Джонс, Дженни Номер счета: 108СК, $10.98 Джонс, Ральф Номер счета: 434СК, ($123.32) Джонс, Ральф Номер счета: 454ММ, $987.13 Джонс, Ральф Номер счета: 436CD, $1,923.85 28) var acclnfo = from acc in accounts orderby x.LastName, x.FirstName, x.Balance descending select acc; 29) Джонс, Дженни Номер счета: 108СК, $10.98 Джонс, Ральф Номер счета: 436CD, $1,923.85 Джонс, Ральф Номер счета: 454ММ, $987.13 Джонс, Ральф Номер счета: 434СК, ($123.32) 30) select выражение 31) Листинг 9.7 // Использовать оператор select для возврата квадратных // корней всех положительных значений, // содержащихся в массиве типа double. using System; using System.Linq; class SelectDemo { static void Main() { double[] nums = {-10.0, 16.4, 12.125, 100.85, -2.2, 25.25, -3.5}; // Сформировать запрос на получение квадратных корней всех // положительных значений, содержащихся в массиве nums. var sqrRoots = from n in nums where n > 0 select Math.Sqrt(n); Console.WriteLine( "Квадратные корни положительных значений,\n" + "округленные до двух десятичных цифр:"); // Выполнить запрос и вывести его результаты. foreach(double г in sqrRoots) Console.WriteLine("{0:#.##}", r); } } 32) Квадратные корни положительных значений, округленные до двух десятичных цифр: 4.05 3.48 10.04 5.02 33) select Math.Sqrt(n); 34) Листинг 9.8 // Возвратить часть значения переменной диапазона. 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("Герберт", "Herb@HerbSchildt.com"), new EmailAddress("Том", "Tom@HerbSchildt.com"), new EmailAddress("Capa", "Sara@HerbSchildt.com") }; // Сформировать запрос на получение адресов // электронной почты. var eAddrs = from entry in addrs select entry.Address; Console.WriteLine("Адреса электронной почты:"); // Выполнить запрос и вывести его результаты, foreach(string s in eAddrs) Console.WriteLine(" " + s); } } 35) Адреса электронной почты: Herb@HerbSchildt.com Tom@HerbSchildt.com Sara@HerbSchildt.com 36) Листинг 9.9 // Использовать запрос для получения последовательности объектов // типа 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 ); } } 37) Список адресов электронной почты: Герберт: Herb@HerbSchildt.com Том: Tom@HerbSchildt.com Сара: Sara@HerbSchildt.com 38) Листинг 9.10 // Использовать два вложенных оператора 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', ‘В', 'C' }; char[] chrs2 = { 'X',‘Y', '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); } } 39) Все сочетания букв ABC и XYZ: А X A Y A Z В X В Y В Z С X С Y С Z 40) var pairs = from chi in chrs from ch2 in chrs2 select new ChrPair(chl, ch2); 43) group переменная_диапазона by ключ 44) Листинг 9.12 // Продемонстрировать применение оператора group. using System; using System.Linq; class GroupDemo { static void Main() { string[] websites = { "hsNameA.com", "hsNameB.net", "hsNameC.net“, "hsNameD.com", "hsNameE.org", "hsNameF.org" "hsNameG.tv", "hsNameH.net", "hsNamel.tv" }; // Сформировать запрос на получение списка // веб-сайтов, группируемых по имени домена // самого верхнего уровня. var webAddrs = from addr in websites where addr.LastlndexOf('.') != -1 group addr by addr.Substring( addr.LastlndexOf('.')); // Выполнить запрос и вывести его результаты. foreach(var sites in webAddrs) { Console.WriteLine("Веб-сайты, сгруппированные " + "по имени домена" + sites.Key); foreach(var site in sites) Console.WriteLine (" " + site); Console.WriteLine(); } } } 45) Веб-сайты, сгруппированные по имени домена .соm hsNameA.соm hsNameD.соm Веб-сайты, сгруппированные по имени домена .net hsNameB.net hsNameC.net hsNameH.net Веб-сайты, сгруппированные по имени домена .org hsNameE.org hsNameF.org Веб-сайты, сгруппированные по имени домена .tv hsNameG.tv hsNamel.tv 46) var webAddrs = from addr in websites where addr.LastlndexOf('.') != -1 group addr by addr.Substring(addr.LastlndexOf('.')); 47) foreach(IGrouping<string, string> sites in webAddrs) { Console.WriteLine("Веб-сайты, сгруппированные " + "по имени домена" + sites.Key); foreach(string site in sites) Console.WriteLine(" " + site); Console.WriteLine (); } 48) // Использовать оператор into вместе с оператором group. using System; using System.Linq; class IntoDemo { static void Main() { string[] websites = {"hsNameA.com", "hsNameB.net", "hsNameC.net", "hsNameD.com", "hsNameE.org", "hsNameF.org", "hsNameG.tv", "hsNameH.net", "hsNamel.tv" }; // Сформировать запрос на получение списка // веб-сайтов, группируемых // по имени домена самого верхнего уровня, но // выбрать только те группы, которые состоят // более чем из двух членов. // Здесь ws — это переменная диапазона для ряда групп, // возвращаемых при выполнении первой половины запроса, var webAddrs = from addr in websites where addr.LastlndexOf(1.1) != -1 group addr by addr.Substring(addr.LastlndexOf('.')) into ws where ws.Count() > 2 select ws; // Выполнить запрос и вывести его результаты. Console.WriteLine("Домены самого верхнего уровня " + "с более чем двумя членами.\n"); foreach(var sites in webAddrs) { Console.WriteLine("Содержимое домена: " + sites.Key); foreach(var site in sites) Console.WriteLine (" " + site); Console.WriteLine(); } } } 49) Домены самого верхнего уровня с более чем двумя членами. Содержимое домена: .net hsNameB.net hsNameC.net hsNameH.net 50) group addr by addr.Substring(addr.LastlndexOf('.')) into ws where ws.Count() > 2 select ws; 51a) let имя = выражение 51) Листинг 9.13 // Использовать оператор let вместе с вложенным // оператором from. using System; using System.Linq; class LetDemo { static void Main() { string[] strs = { "alpha", "beta", "gamma" }; // Сформировать запрос на получение символов, // возвращаемых из строк в отсортированной // последовательности. Обратить внимание на // применение вложенного оператора from. var chrs = from str in strs let chrArray = str.ToCharArray() from ch in chrArray orderby ch select ch; Console.WriteLine( "Отдельные символы, отсортированные по порядку:"); // Выполнить запрос и вывести его результаты. foreach(char c in chrs) Console.Write(c + " "); Console.WriteLine(); } } 52) Отдельные символы, отсортированные по порядку: a a a a a b e g h l m m p t 53) let chrArray = str.ToCharArray() 54) Листинг 9.14 var webAddrs = from addr in websites let idx = addr.LastlndexOf('.') where idx != -1 group addr by addr.Substring(idx) into ws where ws.Count() > 2 select ws; 55) from переменная_диапазона_А in источник_данных_А join переменная_диапазона_В in источник_данных_В on переменная_диапазона_А.свойство equals переменная_диапазона_В.свойство 56) Листинг 9.15 // Продемонстрировать применение оператора join. using System; using System.Linq; // Класс, связывающий наименование товара с его // порядковым номером. class Item { public string Name { get; set; } public int ItemNumber { get; set; } public Item(string n, int inum) { Name = n; ItemNumber = inum; } } // Класс, связывающий наименование товара // c состоянием его запасов на складе. class InStockStatus { public int ItemNumber { get; set; } public bool InStock { get; set; } public InStockStatus(int n, bool b) { ItemNumber = n; InStock = b; } } // Класс, инкапсулирующий наименование товара и // состояние его запасов на складе. class Temp { public string Name { get; set; } public bool InStock { get; set; } public Temp(string n, bool b) { Name = n; InStock = b; } } class JoinDemo { static void Main() { Item[] items = { new Item("Кусачки", 1424), new Item("Тиски", 7892), new Item("Молоток", 8534), new Item("Пила", 6411) }; InStockStatus[] statusList = new InStockStatus(1424, new InStockStatus(7892, new InStockStatus(8534, new InStockStatus(6411, }; { true), false), true), true) // Сформировать запрос, объединяющий объекты классов // Item и InStockStatus для составления списка // наименований товаров и их наличия на складе. // Обратить внимание на формирование // последовательности объектов класса Temp. var inStockList = from item in items join entry in statusList on item.ItemNumber equals entry.ItemNumber select new Temp(item.Name, entry.InStock); Console.WriteLine("Товар\tНаличие\n"); // Выполнить запрос и вывести его результаты. foreach(Temp t in inStockList) Console.WriteLine("{0}\t{1}", t.Name, t.InStock); } } 57) Товар Кусачки Тиски Молоток Пила True Наличие True False True 58) var inStockList = from item in items 59) join entry in statusList on item.ItemNumber equals entry.ItemNumber 60) select new Temp(item.Name, entry.InStock);