.NET Framework SelectMany (mappa piana)

Esempio

Enumerable.Select restituisce un elemento di output per ogni elemento di input. Mentre Enumerable.SelectMany produce un numero variabile di elementi di output per ciascun elemento di input. Ciò significa che la sequenza di output può contenere più o meno elementi rispetto alla sequenza di input.

Lambda expressions passate a Enumerable.Select devono restituire un singolo elemento. Le espressioni lambda passate a Enumerable.SelectMany devono produrre una sequenza figlio. Questa sequenza figlio può contenere un numero variabile di elementi per ciascun elemento nella sequenza di input.

Esempio

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()));

Produzione:

1,2,3,4,5,6

Visualizza la demo

Enumerable.SelectMany può essere ottenuta anche con una query sintassi basata utilizzando due consecutivi from clausole:

var allInvoicesFromAllCustomers
    = from customer in customers
      from invoice in customer.Invoices
      select invoice;