LINQ_2

advertisement
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);
Download