Enumerable.Select为每个输入元素返回一个输出元素。而 Enumerable.SelectMany为每个输入元素生成可变数量的输出元素。这意味着输出序列可能包含比输入序列更多或更少的元素。
Lambda expressions传递给Enumerable.Select必须返回一个项目。传递给的Lambda表达式Enumerable.SelectMany必须产生一个子序列。对于输入序列中的每个元素,此子序列可能包含不同数量的元素。
例
class Invoice { public int Id { get; set; } } class Customer { public Invoice[] Invoices {get;set;} } var customers = new[] { new Customer { Invoices = new[] { new Invoice {Id=1}, new Invoice {Id=2}, } }, new Customer { Invoices = new[] { new Invoice {Id=3}, new Invoice {Id=4}, } }, new Customer { Invoices = new[] { new Invoice {Id=5}, new Invoice {Id=6}, } } }; var allInvoicesFromAllCustomers = customers.SelectMany(c => c.Invoices); Console.WriteLine( string.Join(",", allInvoicesFromAllCustomers.Select(i => i.Id).ToArray()));
输出:
1,2,3,4,5,6
观看演示
Enumerable.SelectMany使用两个连续from子句的基于语法的查询也可以实现:
var allInvoicesFromAllCustomers = from customer in customers from invoice in customer.Invoices select invoice;