Класс Enumerable LINQ - Выбор последовательностей

ОГЛАВЛЕНИЕ

Выбор последовательностей

Класс Enumerable предоставляет два разных метода расширения, которые позволяют выбрать последовательность элементов, проецирующую элементы из входной последовательности в выходную последовательность. Метод Enumerable.Select просто проецирует каждый элемент в новую форму. В следующем примере берется последовательность, содержащая клиентов из США из таблицы Customers базы данных Northwind, затем результаты проецируются в последовательность, содержащую нумерованный список имен контактных лиц.

' From SelectDemo in the sample:
Dim db As New SimpleDataContext
Dim results = _
  From cust In db.Customers _
  Where cust.Country = "USA"
Dim selectResults = results.Select( _
  Function(cust, index) _
  String.Format("{0}. {1}", _
  index + 1, cust.ContactName))

Обратите внимание, что у метода Select имеется несколько перегруженных версий. После выполнения этого кода selectResults содержит список значений, сходный со следующим.

  1. Howard Snyder
  2. Yoshi Latimer
  3. John Steel
  4. Jaime Yorres
  5. Fran Wilson
  6. Rene Phillips
  7. Paula Wilson
  8. Jose Pavarotti
  9. Art Braunschweiger
  10. Liz Nixon
  11. Liu Wong
  12. Helvetius Nagy
  13. Karl Jablonski

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

' From SelectManyDemo in the sample:
Dim db As New SimpleDataContext
Dim categories = _
  From cat In db.Categories Where cat.Products.Count < 7
Dim manyResults As IEnumerable(Of String) = _
  categories.SelectMany(Function(cat, index) _
  cat.Products.Select( _
  Function(prod As Product) String.Format("{0}. Category {1}: {2}", _
  index, prod.CategoryID, prod.ProductName)))

В этом случае лямбда-выражение, переданное методу SelectMany, принимает ссылку на конкретную категорию, работая по очереди со всеми категориями. Данная конкретная перегрузка метода SelectMany передает лямбда-выражению индекс категории наряду с категорией. При данной категории и ее индексе лямбда-выражение вызывает метод Select свойства категории Products, обеспечивая его выполнение для каждого продукта в рамках категории. Данный пример возвращает последовательность, содержащую следующий список строк. Обращение к SelectMany завершается сворачиванием исходной иерархии категория/продукт в единственный список значений.

0. Category 6: Mishi Kobe Niku
0. Category 6: Alice Mutton
0. Category 6: Thuringer Rostbratwurst
0. Category 6: Perth Pasties
0. Category 6: Tourtiere
0. Category 6: Pate chinois
1. Category 7: Uncle Bob's Organic Dried Pears
1. Category 7: Tofu
1. Category 7: Rossle Sauerkraut
1. Category 7: Manjimup Dried Apples
1. Category 7: Longlife Tofu