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;