Главная » C# » Разбивка результатов на группы LINQ в Visual C# (Sharp)

0

В предыдущих примерах запросы LINQ возвращали список клиентов, которым нужно присвоить дополнительные бонусные очки. Но что, если мы не хотим прваивать очки сразу же? Что, если мы хотим разбить клиентов на группы: тех, которые должны получить очки  и  тех,  которые  не должны  получить  очки?  Даая  задача решается  с помощью возможности  группирования  LINQ,  как показано в следующем коде:

var groupedcustomers =

from customer in customers

group customer by customer.Points > 5 into rewarded

select new { ShouldReward = rewarded.Key, Customers = rewarded };

Использование ключевого слова group меняет характер оператора select. Клевое слово group можно рассматривать, как специфичную форму оператора select. Прежде чем обработка дойдет до select, ключевое слово group создает новый список элементов, которые передаются в виде отдельных списков оперору select.

В данном примере это означает, что оператор from выберет всех клиентов, каждый из которых передается коду, выполняющему операцию, которая возвращает значие. Возвращенное значение в виде булевого true или false указывает, поощрять ли клиента дополнительными очками или нет. Если значение true, то клиенту нужно  дать  дополнительные  очки.  Независимо  от состояния,  клиент добавляется к группе, которая будет временно называться rewarded (поощренные).

Если преобразовать ключевые слова from и group в  код на С#, то получившийся код будет похож на следующий код (хотя и не совсем такой, но достаточно блиий, чтобы дать хорошее представление о том, что происходит):

Dictionary<bool,  List<Customer>> grouped = new Dictionary<bool, List<Customer>>();

grouped.Add(true, new List<Customer>()); grouped.Add(false, new List<Customer>()); foreach (var customer in customers) {

if (customers.Points >5 ) { grouped[true].Add(customer);

else {

grouped[false].Add(customer);

}

}

Ключевое слово group создает список пар "ключ/значение", в котором  каждый ключ ссылается на список клиентов. Преобразованный на С# код демонстрирует, что ключевое слово group создает новый список элементов, которые обрабатывтся в цикле, когда выполняется оператор select.

Код оператора select создает новый набор объектов, которые ссылаются на ключ или группу и список клиентов, которые удовлетворяют указанным критериям. Преобразовав оператор select в псевдокод на С#, получим код наподобие слующего:

List<object> resultSet = new List<object>(); foreach (var key in grouped.Keys) {

resultSet.Add(new { ShouldReward = key, Customers = grouped[key] });

}

Результатом  выполнения  этого  кода  будет список  объектов,  содержащих  разлиые  ключи  и  клиентов,  соответствующих  ключам.  Чтобы  обработать  элементы

списка в цикле, нужно реализовать двухуровневый цикл, полагая,  что был примен код LINQ, показанный в начале раздела:

foreach (var grouping in groupedCustomers) { Console.WriteLine("Should be rewarded (" +

grouping.ShouldReward + ") ") ; foreach (var customer in grouping.Customers) {

Console.WriteLine("Customer (" + customer.ToString() + ")");

}

}

Сначала обрабатываются в цикле все ключи, после чего обрабатываются  в  цикле все клиенты, ассоциированные с каждым ключом.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии