.NET Framework SelectMany(平面图)

示例

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;