Класс 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 содержит список значений, сходный со следующим.
- Howard Snyder
- Yoshi Latimer
- John Steel
- Jaime Yorres
- Fran Wilson
- Rene Phillips
- Paula Wilson
- Jose Pavarotti
- Art Braunschweiger
- Liz Nixon
- Liu Wong
- Helvetius Nagy
- 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