.NET Framework SelectMany (carte plate)


Exemple

Enumerable.Select renvoie un élément de sortie pour chaque élément d'entrée. Alors que Enumerable.SelectMany produit un nombre variable d'éléments de sortie pour chaque élément d'entrée. Cela signifie que la séquence de sortie peut contenir plus ou moins d’éléments que ceux de la séquence d’entrée.

Lambda expressions transmises à Enumerable.Select doivent renvoyer un seul élément. Les expressions lambda transmises à Enumerable.SelectMany doivent produire une séquence enfant. Cette séquence enfant peut contenir un nombre variable d'éléments pour chaque élément de la séquence d'entrée.

Exemple

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

Sortie:

1,2,3,4,5,6

Voir la démo

Enumerable.SelectMany peut également être obtenue avec une requête basée syntaxe en utilisant deux consécutifs from clauses:

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