61) new { имя_А = значение_А, имя_В = значение_В, ... } new { Count = 10, Max = 100, Min = 0 } 62) var myOb = new { Count = 10, Max = 100, Min = 0 } 63) Console.WriteLine("Счет равен " + myOb.Count); if(i <= myOb.Max && i >= myOb.Min) // ... 64) Листинг 9.16 // Использовать анонимный тип для усовершенствования // программы, демонстрирующей применение оператора join. using System; using System.Linq;


The Presentation inside:

Slide 0

61) new { имя_А = значение_А, имя_В = значение_В, ... } new { Count = 10, Max = 100, Min = 0 } 62) var myOb = new { Count = 10, Max = 100, Min = 0 } 63) Console.WriteLine("Счет равен " + myOb.Count); if(i <= myOb.Max && i >= myOb.Min) // ... 64) Листинг 9.16 // Использовать анонимный тип для усовершенствования // программы, демонстрирующей применение оператора join. using System; using System.Linq;


Slide 1

// Класс, связывающий наименование товара с его порядковым номером. class Item { public string Name { get; set; } public int ItemNumber { get; set; } public Item(string n, int inum) { Name = n; ItemNumber = inum; } } // Класс, связывающий наименование товара с состоянием // его запасов на складе. class InStockStatus { public int ItemNumber { get; set; } public bool InStock { get; set; }


Slide 2

public InStockStatus(int n, bool b) { ItemNumber = n; InStock = b; } } class AnonTypeDemo { static void Main() { Item[] items = { new Item("Кусачки", 1424), new Item("Тиски", 7892), new Item("Молоток", 8534), new Item("Пила", 6411) }; InStockStatus[] statusList = { new InStockStatus(1424, true), new InStockStatus(7892, false), new InStockStatus(8534, true), new InStockStatus(6411, true) };


Slide 3

// Сформировать запрос, объединяющий объекты классов Item // и InStockStatus для составления списка наименований // товаров и их наличия на складе. Теперь для этой цели // используется анонимный тип. var inStockList = from item in items join entry in statusList on item.ItemNumber equals entry.ItemNumber select new { Name = item.Name, InStock = entry.InStock }; Console.WriteLine("Товар\tНаличие\n"); // Выполнить запрос и вывести его результаты. foreach(var t in inStockList) Console.WriteLine("{0}\t{1}", t.Name, t.InStock); } }


Slide 4

65) select new { Name = item.Name, InStock = entry.InStock }; 66) select new { item.Name, entry.InStock }; 67) Листинг 9.17 // Продемонстрировать применение простого группового объединения. using System; using System.Linq; // Этот класс связывает наименование вида транспорта, // например, поезда, с общей классификацией транспорта: // наземного, морского, воздушного или речного. class Transport { public string Name { get; set; } public string How { get; set; }


Slide 5

public Transport(string n, string h) { Name = n; How = h; } } class GroupJoinDemo { static void Main() { // Массив классификации видов транспорта. string[] travelTypes = { "Воздушный", "Морской", "Наземный", "Речной" };


Slide 6

// Массив видов транспорта. Transport[] transports = { new Transport("велосипед", "Наземный"), new Transport("аэростат", "Воздушный"), new Transport("лодка", "Речной"), new Transport("самолет", "Воздушный"), new Transport("каноэ", "Речной"), new Transport("биплан", "Воздушный"), new Transport("автомашина", "Наземный"), new Transport("судно", "Морской"), new Transport("поезд", "Наземный") }; // Сформировать запрос, в котором групповое // объединение используется для составления списка // видов транспорта по соответствующим категориям. var byHow = from how in travelTypes join trans in transports on how equals trans.How into lst select new { How = how, Tlist = lst };


Slide 7

// Выполнить запрос и вывести его результаты. foreach(var t in byHow) { Console.WriteLine("К категории <{0} транспорт> " + "относится: ", t.How); foreach(var m in t.Tlist) Console.WriteLine(" " + m.Name); Console.WriteLine(); } } 68) К категории <Воздушный транспорт> относится: аэростат самолет биплан   К категории <Морской транспорт> относится: Судно


Slide 8

К категории <Наземный транспорт> относится: велосипед автомашина поезд   К категории <Речной транспорт> относится: лодка каноэ 69) var byHow = from how in travelTypes join trans in transports on how equals trans.How into lst select new { How = how, Tlist = lst };


Slide 9

70) foreach(var t in byHow) { Console.WriteLine("К категории <{0} транспорт> относится:", t.How);   foreach(var m in t.Tlist) Console.WriteLine(" " + m.Name);   Console.WriteLine() ; }


Slide 10

72) delegate TResult Func<in Т, out TResult>(Т arg) 73) Листинг 9.18 // Использовать методы запроса для формирования простого запроса. Это переделанный вариант // первого примера программы из данной главы. using System; using System.Linq; class SimpQuery { static void Main() { int[] nums = { 1, -2, 3, 0, -4, 5 }; // Использовать методы Where() и Select() для // формирования простого запроса.


Slide 11

var posNums = nums.Where(n => n > 0).Select(r => r); Console.Write( "Положительные значения из масива nums: "); // Выполнить запрос и вывести его результаты. foreach(int i in posNums) Console.Write(i + " "); Console.WriteLine(); } } 74) Положительные значения из массива nums: 1 3 5 75) var posNums = nums.Where(n => n > 0).Select(r => r); 76) var posNums = nums.Where(n => n > 0).Select (r => r * 10); 77) var posNums = nums.Where (n => n > 0).OrderByDescending(j => j);


Slide 12

78) Листинг 9.19 // Продемонстрировать применение метода GroupBy(). // Это переработанный вариант примера, приведенного // ранее для демонстрации синтаксиса запросов. using System; using System.Linq; class GroupByDemo { static void Main() { string[] websites = { "hsNameA.com", "hsNameB.net", "hsNameC.net", "hsNameD.com","hsNameE.org", "hsNameF.org", "hsNameG.tv", "hsNameH.net", "hsNameI.tv" };


Slide 13

// Использовать методы запроса для группирования // веб-сайтов по имени домена самого верхнего // уровня. var webAddrs = websites.Where(w => w.LastIndexOf('.') != 1). GroupBy(x => x.Substring(x.LastIndexOf('.'))); // Выполнить запрос и вывести его результаты. foreach(var sites in webAddrs) { Console.WriteLine("Веб-сайты, сгруппированные " + "по имени домена" + sites.Key); foreach(var site in sites) Console.WriteLine(" " + site); Console.WriteLine();   } } }


Slide 14

79) var inStockList = from item in items join entry in statusList on item.ItemNumber equals entry.ItemNumber select new Temp(item.Name, entry.InStock); 80) // Использовать метод запроса Join() для составления // списка наименований товаров и состояния // их запасов на складе. var inStockList = items.Join(statusList, k1 => kl.ItemNumber, k2 => k2.ItemNumber, (kl, k2) => new Temp(k1.Name, k2.InStock) );


Slide 15

81) var inStockList = items.Join(statusList, k1 => k1.ItemNumber, k2 => k2.ItemNumber, (kl, k2) => new { kl.Name, k2.InStock} ); 82) where х < 10 83) Where(х => х < 10)


Slide 16


Slide 17

85) Листинг 9.20 // Использовать ряд методов расширения, определенных // в классе Enumerable. using System; using System.Linq; class ExtMethods { static void Main() { int[] nums = { 3, 1, 2, 5, 4 }; Console.WriteLine("Минимальное значение равно " + nums.Min()); Console.WriteLine("Максимальное значение равно “ + nums.Max()); Console.WriteLine("Первое значение равно " + nums.First());


Slide 18

86) Листинг 9.21 Минимальное значение равно 1 Максимальное значение равно 5 Первое значение равно 3 Последнее значение равно 4 Суммарное значение равно 15 Среднее значение равно 3 Все значения больше нуля. По крайней мере одно значение является четным Массив содержит значение 3. 87) // Использовать метод Average() вместе с синтаксисом // запросов. using System;  using System.Linq; class ExtMethods2 { static void Main()


Slide 19

{ int[] nums = { 1, 2, 4, 8, 6, 9, 10, 3, 6, 7 }; var ltAvg = from n in nums let x = nums.Average() where n < x select n; Console.WriteLine("Среднее значение равно " + nums.Average()); Console.Write("Значения меньше среднего: "); // Выполнить запрос и вывести его результаты. foreach(int i in ltAvg) Console.Write(i + " "); Console.WriteLine(); } }


Slide 20

88) Среднее значение равно 5.6 Значения меньше среднего: 1 2 4 3 89) var ltAvg = from n in nums let x = nums.Average() where n < x select n; 90) Листинг 9.22 // Использовать режим немедленного выполнения запроса. using System; using System.Linq; class ImmediateExec { static void Main() { int[] nums = { 1, -2, 3, 0, -4, 5 };


Slide 21

// Сформировать запрос на получение количества // положительных значений в массиве nums. int len = (from n in nums where n > 0 select n).Count(); Console.WriteLine( "Количество положительных значений в массиве nums: " + len); } } 91) Количество положительных значений в массиве nums: 3 92) var posNums = from n in nums where n > 0 select n; int len = posNums.Count(); // запрос выполняется здесь


Slide 22

93) int[] pnums = posNum.ToArray(); // запрос выполняется здесь foreach(int i in pnums) { Console.Write(i + " "); } 94) Листинг 19.23 // Пример простого дерева выражений. using System; using System.Linq; using System.Linq.Expressions; class SimpleExpTree { static void Main() {


Slide 23

// Представить лямбда-выражение в виде данных. Expression<Func<int, int, bool>> IsFactorExp = (n, d) => (d != 0) ? (n % d) == 0 : false; // Скомпилировать данные выражения в исполняемый код. Func<int, int, bool> IsFactor = IsFactorExp.Compile(); // Выполнить выражение. if(IsFactor(10, 5)) Console.WriteLine("Число 5 является множителем 10."); if(!IsFactor(10, 7)) Console.WriteLine( "Число 7 не является множителем 10."); Console.WriteLine(); } }


Slide 24

95) Число 5 является множителем 10. Число 7 не является множителем 10. 96) Expression<Func<int, int, bool>> IsFactorExp = (n, d) => (d != 0) ? (n % d) == 0 : false; 97) Func<int, int, bool> IsFactor = IsFactorExp.Compile(); 98) static возращаемый_тип имя ( this тип_вызывающего_объекта ob, список_параметров)


Slide 25

99) Листинг 9.24 // Создать и использовать ряд методов расширения. using System; using System.Globalization; static class MyExtMeths { // Возвратить обратную величину числового // значения типа double. public static double Reciprocal(this double v) { return 1.0 / v; } // Изменить на обратный регистр букв в символьной // строке и возвратить результат.


Slide 26

public static string RevCase(this string str) { string temp = ""; foreach(char ch in str) { if(Char.IsLower(ch)) temp += Char.ToUpper(ch, CultureInfo.CurrentCulture); else temp += Char.ToLower(ch, CultureInfo.CurrentCulture); } return temp; } // Возвратить абсолютное значение выражения n / d. public static double AbsDivideBy(this double n, double d) { return Math.Abs(n / d); } }


Slide 27

class ExtDemo { static void Main() { double val = 8.0; string str = "Alpha Beta Gamma"; // Вызвать метод равширения Reciprocal(). Console.WriteLine( "Обратная величина {0} равна {1}", val, val.Reciprocal()); // Вызвать метод расширения RevCase(). Console.WriteLine(str + " после сиены регистра “ + str.RevCase()); // Использовать метод расширения AbsDivideBy(); Console.WriteLine( "Результат вызова метода val.AbsDivideBy(-2): " + val.AbsDivideBy(-2)); } }


Slide 28

100) Обратная величина 8 равна 0.125 Alpha Beta Gamma после смены регистра: aLPHA bЕТА gАММА Результат вызова метода val.AbsDivideBy(-2): 4 101) val.AbsDivideBy(-2) 102) 8.0.Reciprocal() 8.0.AbsDivideBy(-1) 103) "AbCDe".RevCase()


×

HTML:





Ссылка: