.NET Framework SelectMany (평면지도)

Enumerable.Select 는 모든 입력 요소에 대한 출력 요소를 반환합니다. 반면 Enumerable.SelectMany 는 각 입력 요소에 대해 가변 개수의 출력 요소를 생성합니다. 이것은 출력 순서가 입력 순서보다 더 많거나 적은 요소를 포함 할 수 있음을 의미합니다.

Enumerable.Select 전달 된 Lambda expressions 단일 항목을 반환해야합니다. 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;