Программирование >>  Программирование с использованием ajax 

1 ... 274 275 276 [ 277 ] 278 279 280 ... 396


Описание полученных результатов

Класс Customer и инициализация списка customers - такие же, как в предыдущих примерах.

Основной запрос состоит из конструкции from. . .orderby. . . select в синтаксисе запросов, как и те, что создавались ранее в этой главе, но без частей where и orderby. Вы проектируете поля, представляющие интерес, с помощью select, в этом случае - свойства City, Country и Region:

var queryResults = from с in customers

select new { c.City, c.Country, c.Region }

Поскольку операция First () возвращает значение единственного объекта, а не результирующий набор, создавать цикл foreach не нужно; вместо этого результат печатается непосредственно:

Console.WriteLine(queryResults.First(с => с.Region == Africa ));

Это находит заказчика, и результат City = Lagos, Country = Nigeria, Region = Africa выводится на печать. Затем осуществляется запрос заказчика из Антарктиды с использованием FirstOrDefault ():

Console.WriteLine(queryResults.FirstOrDefault(с => с.Region == Antarctica ));

Это не находит никакого реального результата, поэтому возвращается null (пустой результат), который выглядит как пустая строка. Что случилось бы, используй вы операцию First () вместо FirstOrDef ault () в таком запросе? В этом случае было бы получено следующее исключение:

System.InvalidOperationException: Sequence contains no matching element System. InvalidOperationException: Последовательность не содержит совпадающего элемента

Вместо этого FirstOrDef ault () возвращает элемент по умолчанию для списка, если критерий поиска не удовлетворяется ни одной записью, и этим элементом по умолчанию является null для данного анонимного типа. Иначе для региона Антарктиды возникло бы исключение.

Код печати результатов и приостановки вывода - такой же, как и в предыдущих примерах, за исключением небольших изменений в экранных сообщениях.

Операции с множествами

LINQ поддерживает стандартные операции множеств, такие как UnionO и Intersect (), оперирующие результатами запроса. Вы использовали одну из этих операций, когда ранее писали запрос Distinct ().

В следующем практическом занятии вы добавите простой список заказов, который прислан гипотетическим заказчиком, и воспользуетесь стандартными операциями множеств для сопоставления заказов с существующими заказчиками.

пра1аическое занятие Операции множеств *

Выполните следующие шаги для создания примера в Visual С# 2008.

1. Создайте новое консольное приложение по имени 26-15-SetOperators в каталоге C:\BegVCSharp\Chapter26.

2. Скопируйте код создания класса Customer и инициализации списка customers (List<Customer> customers) из примера 2б-7-QueryComplexObjects.



3. После объявления класса Customer добавьте следующий класс Order:

class Order {

public string ID { get; set; } public decimal Amount { get; set; }

4. В методе Main (), вслед за инициализацией списка customers, создайте и инициализируйте список orders данными, показанными ниже:

List<Order> orders = new List<Order> {

new Order

Amount=100

new Order

Amount=200

new Order

Amount=

= 300

new Order

Amount=

=400

new Order

Amount=

=500

new Order

Amount=600

new Order

Amount=700

new Order

Amount=

=800

new Order

X ,

Amount=

= 900

new Order

Amount=1000

new Order

Z ,

Amount=1100

5. Вслед за инициализацией списка orders введите такие запросы:

var customerlDs =

from с in customers select c.ID

var orderlDs =

from о in orders select o.ID

6. Введите следующий запрос, использующий Intersect ():

var customersWithOrders = customerlDs.Intersect(orderlDs); Console.WriteLine( ID заказчиков с заказами: ); foreach (var item in customersWithOrders)

Console.Write(

Console.WriteLine(

item)

7. Затем введите следующий запрос, использующий Except (): Console.WriteLine ( ID заказов без заказчиков: ); var ordersNoCustomers = orderlDs.Except(customerlDs); foreach (var item in ordersNoCustomers)

Console.Write( {0} , item);

Console.WriteLine();

8. И, наконец, введите следующий запрос, использующий Union ():

Console.WriteLine( Все ID заказчиков и заказов: ); var allCustomerOrderlDs = orderlDs.Union(customerlDs); foreach (var item in allCustomerOrderlDs) {

Console.Write( {0} , item);



9. Откомпилируйте и выполните программу. Вы получите такой вывод:

ID заказчиков с заказами: Р Q R S Т

ID заказов без заказчиков: и V W X Y Z

Все ID заказчиков и заказов:

PQRSTUVWXYZABCDEFGHIJKLMNO Программа завершена, нажмите Enter для продолжения:

Описание полученных результатов

Класс Customer и инициализация списка customers - те же, что и в предыдущих примерах. Новый класс Order подобен классу Customer и использует средство автоматических свойств С# 3.0 для объявления общедоступных свойств (ID, Amount):

class Order {

public string ID { get; set; } public decimal Amount { get; set; }

Как и класс Customer, это является упрощенным примером с количеством данных, достаточным для демонстрации запроса.

Вы используете два простых запроса from. . .select для получения полей ID из классов Customer и Order, соответственно:

var customerlDs =

from с in customers select c.ID

var orderlDs =

from о in orders select o.ID

Затем с помощью операции множества Intersect () находятся только ID заказчиков, которые имеют соответствующие заказы в результирующем наборе order IDs. В пересечение включаются только те ID, что появляются в обоих результирующих наборах:

var customersWithOrders = customerlDs.Intersect(orderlDs);

Операции множеств требуют, чтобы члены множеств имели одинаковый тип, для гарантии ожидаемого результата. Здесь используется преимущество того факта, что ID в обоих типах объектов являются строками и имеют одинаковую семантику (подобно внешним ключам в базе данных).

Вывод результатов использует тот факт, что ID представлены одиночным символом, поэтому применяется вызов Console .Write () без WriteLine () до конца цикла foreach, чтобы сделать вывод компактным и четким:

Console.WriteLine( ID заказчиков с заказами: ); foreach (var item in customersWithOrders)

Console.Write( { 0} , item);

Console.WriteLine();

Ту же логику печати вы используете и в остальных циклах foreach.



1 ... 274 275 276 [ 277 ] 278 279 280 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика