Enumerable.SelectMany 메서드

정의

시퀀스의 각 요소를 IEnumerable<T> 투영하고 결과 시퀀스를 하나의 시퀀스로 평면화합니다.

오버로드

Name Description
SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

시퀀스의 각 요소를 IEnumerable<T>투영하고, 결과 시퀀스를 하나의 시퀀스로 평면화하고, 그 안에 있는 각 요소에 대해 결과 선택기 함수를 호출합니다.

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

시퀀스의 각 요소를 IEnumerable<T>투영하고, 결과 시퀀스를 하나의 시퀀스로 평면화하고, 그 안에 있는 각 요소에 대해 결과 선택기 함수를 호출합니다. 각 소스 요소의 인덱스는 해당 요소의 중간 프로젝션된 형식으로 사용됩니다.

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>)

시퀀스의 각 요소를 IEnumerable<T> 투영하고 결과 시퀀스를 하나의 시퀀스로 평면화합니다.

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>)

시퀀스의 각 요소를 IEnumerable<T>투영하고 결과 시퀀스를 하나의 시퀀스로 평면화합니다. 각 원본 요소의 인덱스는 해당 요소의 프로젝션된 형식으로 사용됩니다.

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

시퀀스의 각 요소를 IEnumerable<T>투영하고, 결과 시퀀스를 하나의 시퀀스로 평면화하고, 그 안에 있는 각 요소에 대해 결과 선택기 함수를 호출합니다.

public:
generic <typename TSource, typename TCollection, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, System::Collections::Generic::IEnumerable<TCollection> ^> ^ collectionSelector, Func<TSource, TCollection, TResult> ^ resultSelector);
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TCollection,TResult>(this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,System.Collections.Generic.IEnumerable<TCollection>> collectionSelector, Func<TSource,TCollection,TResult> resultSelector);
static member SelectMany : seq<'Source> * Func<'Source, seq<'Collection>> * Func<'Source, 'Collection, 'Result> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TCollection, TResult) (source As IEnumerable(Of TSource), collectionSelector As Func(Of TSource, IEnumerable(Of TCollection)), resultSelector As Func(Of TSource, TCollection, TResult)) As IEnumerable(Of TResult)

형식 매개 변수

TSource

의 요소 형식입니다 source.

TCollection

에 의해 collectionSelector수집된 중간 요소의 형식입니다.

TResult

결과 시퀀스의 요소 형식입니다.

매개 변수

source
IEnumerable<TSource>

프로젝트할 값의 시퀀스입니다.

collectionSelector
Func<TSource,IEnumerable<TCollection>>

입력 시퀀스의 각 요소에 적용할 변환 함수입니다.

resultSelector
Func<TSource,TCollection,TResult>

중간 시퀀스의 각 요소에 적용할 변환 함수입니다.

반품

IEnumerable<TResult>

IEnumerable<T> 해당 요소는 각 요소에서 일대다 변환 함수 collectionSelector 를 호출한 다음 각 시퀀스 요소 source 와 해당 소스 요소를 결과 요소에 매핑한 결과입니다.

예외

source 또는 collectionSelectorresultSelector 입니다 null.

예제

다음 코드 예제에서는 배열에 SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>) 대해 일대다 프로젝션을 수행하고 결과 선택기 함수를 사용하여 최종 호출 Select에 대한 범위의 소스 시퀀스에서 각 해당 요소를 유지하는 방법을 보여 줍니다.

class PetOwner
{
    public string Name { get; set; }
    public List<string> Pets { get; set; }
}

public static void SelectManyEx3()
{
    PetOwner[] petOwners =
        { new PetOwner { Name="Higa",
              Pets = new List<string>{ "Scruffy", "Sam" } },
          new PetOwner { Name="Ashkenazi",
              Pets = new List<string>{ "Walker", "Sugar" } },
          new PetOwner { Name="Price",
              Pets = new List<string>{ "Scratches", "Diesel" } },
          new PetOwner { Name="Hines",
              Pets = new List<string>{ "Dusty" } } };

    // Project the pet owner's name and the pet's name.
    var query =
        petOwners
        .SelectMany(petOwner => petOwner.Pets, (petOwner, petName) => new { petOwner, petName })
        .Where(ownerAndPet => ownerAndPet.petName.StartsWith("S"))
        .Select(ownerAndPet =>
                new
                {
                    Owner = ownerAndPet.petOwner.Name,
                    Pet = ownerAndPet.petName
                }
        );

    // Print the results.
    foreach (var obj in query)
    {
        Console.WriteLine(obj);
    }
}

// This code produces the following output:
//
// {Owner=Higa, Pet=Scruffy}
// {Owner=Higa, Pet=Sam}
// {Owner=Ashkenazi, Pet=Sugar}
// {Owner=Price, Pet=Scratches}
Structure PetOwner
    Public Name As String
    Public Pets() As String
End Structure

Sub SelectManyEx3()
    ' Create an array of PetOwner objects.
    Dim petOwners() As PetOwner =
{New PetOwner With
 {.Name = "Higa", .Pets = New String() {"Scruffy", "Sam"}},
 New PetOwner With
 {.Name = "Ashkenazi", .Pets = New String() {"Walker", "Sugar"}},
 New PetOwner With
 {.Name = "Price", .Pets = New String() {"Scratches", "Diesel"}},
 New PetOwner With
 {.Name = "Hines", .Pets = New String() {"Dusty"}}}

    ' Project an anonymous type that consists of
    ' the owner's name and the pet's name (string).
    Dim query =
petOwners _
.SelectMany(
    Function(petOwner) petOwner.Pets,
    Function(petOwner, petName) New With {petOwner, petName}) _
.Where(Function(ownerAndPet) ownerAndPet.petName.StartsWith("S")) _
.Select(Function(ownerAndPet) _
       New With {.Owner = ownerAndPet.petOwner.Name,
                 .Pet = ownerAndPet.petName
       })

    Dim output As New System.Text.StringBuilder
    For Each obj In query
        output.AppendLine(String.Format("Owner={0}, Pet={1}", obj.Owner, obj.Pet))
    Next

    ' Display the output.
    Console.WriteLine(output.ToString())
End Sub

' This code produces the following output:
'
' Owner=Higa, Pet=Scruffy
' Owner=Higa, Pet=Sam
' Owner=Ashkenazi, Pet=Sugar
' Owner=Price, Pet=Scratches

설명

이 메서드는 지연된 실행을 사용하여 구현됩니다. 즉시 반환 값은 작업을 수행하는 데 필요한 모든 정보를 저장하는 개체입니다. 이 메서드가 나타내는 쿼리는 해당 GetEnumerator 메서드를 직접 호출하거나 C#의 foreach 또는 Visual Basic For Each 사용하여 개체가 열거될 때까지 실행되지 않습니다.

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>) 메서드는 호출 후 발생하는 쿼리 논리에 대한 범위 내의 source 요소를 유지해야 하는 SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)경우에 유용합니다. 코드 예제는 예제 섹션을 참조하세요. 형식의 개체와 형식 TSourceTCollection의 개체 간에 양방향 관계가 있는 경우, 즉 형식 TCollection 개체가 생성한 개체를 검색 TSource 하는 속성을 제공하는 경우 이 오버로드 SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)가 필요하지 않습니다. 대신 개체를 사용하여 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) 개체 TCollectionTSource 다시 이동할 수 있습니다.

쿼리 식 구문에서 각 from 절(C#) 또는 From 절(Visual Basic)은 SelectMany 호출로 변환됩니다.

추가 정보

적용 대상

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)

시퀀스의 각 요소를 IEnumerable<T>투영하고, 결과 시퀀스를 하나의 시퀀스로 평면화하고, 그 안에 있는 각 요소에 대해 결과 선택기 함수를 호출합니다. 각 소스 요소의 인덱스는 해당 요소의 중간 프로젝션된 형식으로 사용됩니다.

public:
generic <typename TSource, typename TCollection, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, int, System::Collections::Generic::IEnumerable<TCollection> ^> ^ collectionSelector, Func<TSource, TCollection, TResult> ^ resultSelector);
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TCollection,TResult>(this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,System.Collections.Generic.IEnumerable<TCollection>> collectionSelector, Func<TSource,TCollection,TResult> resultSelector);
static member SelectMany : seq<'Source> * Func<'Source, int, seq<'Collection>> * Func<'Source, 'Collection, 'Result> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TCollection, TResult) (source As IEnumerable(Of TSource), collectionSelector As Func(Of TSource, Integer, IEnumerable(Of TCollection)), resultSelector As Func(Of TSource, TCollection, TResult)) As IEnumerable(Of TResult)

형식 매개 변수

TSource

의 요소 형식입니다 source.

TCollection

에 의해 collectionSelector수집된 중간 요소의 형식입니다.

TResult

결과 시퀀스의 요소 형식입니다.

매개 변수

source
IEnumerable<TSource>

프로젝트할 값의 시퀀스입니다.

collectionSelector
Func<TSource,Int32,IEnumerable<TCollection>>

각 원본 요소에 적용할 변환 함수입니다. 함수의 두 번째 매개 변수는 소스 요소의 인덱스를 나타냅니다.

resultSelector
Func<TSource,TCollection,TResult>

중간 시퀀스의 각 요소에 적용할 변환 함수입니다.

반품

IEnumerable<TResult>

IEnumerable<T> 해당 요소는 각 요소에서 일대다 변환 함수 collectionSelector 를 호출한 다음 각 시퀀스 요소 source 와 해당 소스 요소를 결과 요소에 매핑한 결과입니다.

예외

source 또는 collectionSelectorresultSelector 입니다 null.

설명

이 메서드는 지연된 실행을 사용하여 구현됩니다. 즉시 반환 값은 작업을 수행하는 데 필요한 모든 정보를 저장하는 개체입니다. 이 메서드가 나타내는 쿼리는 해당 GetEnumerator 메서드를 직접 호출하거나 C#의 foreach 또는 Visual Basic For Each 사용하여 개체가 열거될 때까지 실행되지 않습니다.

SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>) 메서드는 호출 후 발생하는 쿼리 논리에 대한 범위 내의 source 요소를 유지해야 하는 SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)경우에 유용합니다. 코드 예제는 예제 섹션을 참조하세요. 형식의 개체와 형식 TSourceTCollection의 개체 간에 양방향 관계가 있는 경우, 즉 형식 TCollection 개체가 생성한 개체를 검색 TSource 하는 속성을 제공하는 경우 이 오버로드 SelectMany<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)가 필요하지 않습니다. 대신 개체를 사용하여 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) 개체 TCollectionTSource 다시 이동할 수 있습니다.

적용 대상

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>)

시퀀스의 각 요소를 IEnumerable<T> 투영하고 결과 시퀀스를 하나의 시퀀스로 평면화합니다.

public:
generic <typename TSource, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, System::Collections::Generic::IEnumerable<TResult> ^> ^ selector);
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TResult>(this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,System.Collections.Generic.IEnumerable<TResult>> selector);
static member SelectMany : seq<'Source> * Func<'Source, seq<'Result>> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TResult) (source As IEnumerable(Of TSource), selector As Func(Of TSource, IEnumerable(Of TResult))) As IEnumerable(Of TResult)

형식 매개 변수

TSource

의 요소 형식입니다 source.

TResult

에서 반환 selector하는 시퀀스 요소의 형식입니다.

매개 변수

source
IEnumerable<TSource>

프로젝트할 값의 시퀀스입니다.

selector
Func<TSource,IEnumerable<TResult>>

각 요소에 적용할 변환 함수입니다.

반품

IEnumerable<TResult>

IEnumerable<T> 해당 요소는 입력 시퀀스의 각 요소에 대해 일대다 변환 함수를 호출한 결과입니다.

예외

source 또는 selector .입니다 null.

예제

다음 코드 예제에서는 배열에 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) 대해 일대다 프로젝션을 수행하는 방법을 보여 줍니다.

class PetOwner
{
    public string Name { get; set; }
    public List<String> Pets { get; set; }
}

public static void SelectManyEx1()
{
    PetOwner[] petOwners =
        { new PetOwner { Name="Higa, Sidney",
              Pets = new List<string>{ "Scruffy", "Sam" } },
          new PetOwner { Name="Ashkenazi, Ronen",
              Pets = new List<string>{ "Walker", "Sugar" } },
          new PetOwner { Name="Price, Vernette",
              Pets = new List<string>{ "Scratches", "Diesel" } } };

    // Query using SelectMany().
    IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);

    Console.WriteLine("Using SelectMany():");

    // Only one foreach loop is required to iterate
    // through the results since it is a
    // one-dimensional collection.
    foreach (string pet in query1)
    {
        Console.WriteLine(pet);
    }

    // This code shows how to use Select()
    // instead of SelectMany().
    IEnumerable<List<String>> query2 =
        petOwners.Select(petOwner => petOwner.Pets);

    Console.WriteLine("\nUsing Select():");

    // Notice that two foreach loops are required to
    // iterate through the results
    // because the query returns a collection of arrays.
    foreach (List<String> petList in query2)
    {
        foreach (string pet in petList)
        {
            Console.WriteLine(pet);
        }
        Console.WriteLine();
    }
}

/*
 This code produces the following output:

 Using SelectMany():
 Scruffy
 Sam
 Walker
 Sugar
 Scratches
 Diesel

 Using Select():
 Scruffy
 Sam

 Walker
 Sugar

 Scratches
 Diesel
*/
Structure PetOwner
    Public Name As String
    Public Pets() As String
End Structure

Sub SelectManyEx1()
    ' Create an array of PetOwner objects.
    Dim petOwners() As PetOwner =
{New PetOwner With
 {.Name = "Higa, Sidney", .Pets = New String() {"Scruffy", "Sam"}},
 New PetOwner With
 {.Name = "Ashkenazi, Ronen", .Pets = New String() {"Walker", "Sugar"}},
 New PetOwner With
 {.Name = "Price, Vernette", .Pets = New String() {"Scratches", "Diesel"}}}

    ' Call SelectMany() to gather all pets into a "flat" sequence.
    Dim query1 As IEnumerable(Of String) =
petOwners.SelectMany(Function(petOwner) petOwner.Pets)

    Dim output As New System.Text.StringBuilder("Using SelectMany():" & vbCrLf)
    ' Only one foreach loop is required to iterate through
    ' the results because it is a one-dimensional collection.
    For Each pet As String In query1
        output.AppendLine(pet)
    Next

    ' This code demonstrates how to use Select() instead
    ' of SelectMany() to get the same result.
    Dim query2 As IEnumerable(Of String()) =
petOwners.Select(Function(petOwner) petOwner.Pets)
    output.AppendLine(vbCrLf & "Using Select():")
    ' Notice that two foreach loops are required to iterate through
    ' the results because the query returns a collection of arrays.
    For Each petArray() As String In query2
        For Each pet As String In petArray
            output.AppendLine(pet)
        Next
    Next

    ' Display the output.
    Console.WriteLine(output.ToString())
End Sub

' This code produces the following output:
'
' Using SelectMany():
' Scruffy
' Sam
' Walker
' Sugar
' Scratches
' Diesel
'
' Using Select():
' Scruffy
' Sam
' Walker
' Sugar
' Scratches
' Diesel

설명

이 메서드는 지연된 실행을 사용하여 구현됩니다. 즉시 반환 값은 작업을 수행하는 데 필요한 모든 정보를 저장하는 개체입니다. 이 메서드가 나타내는 쿼리는 해당 GetEnumerator 메서드를 직접 호출하거나 C#의 foreach 또는 Visual Basic For Each 사용하여 개체가 열거될 때까지 실행되지 않습니다.

이 메서드는 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) 입력 시퀀스를 열거하고, 변환 함수를 사용하여 각 요소를 매핑 IEnumerable<T>한 다음, 이러한 IEnumerable<T> 각 개체의 요소를 열거하고 생성합니다. 즉, 각 요소에 sourceselector 대해 호출되고 값 시퀀스가 반환됩니다. SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) 그런 다음 이 2차원 컬렉션 컬렉션을 1차원 IEnumerable<T> 으로 평면화하고 반환합니다. 예를 들어 쿼리가 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TResult>>) 사용하여 데이터베이스의 각 고객에 대한 주문(Order 형식)을 가져오는 경우 결과는 C#의 IEnumerable<Order> 또는 Visual Basic IEnumerable(Of Order) 형식입니다. 대신 쿼리가 Select 사용하여 주문을 가져오는 경우 주문 컬렉션 컬렉션이 결합되지 않고 결과는 C#의 IEnumerable<List<Order>> 형식이거나 Visual Basic IEnumerable(Of List(Of Order)) 형식입니다.

쿼리 식 구문에서 각 from 절(C#) 또는 From 절(Visual Basic)은 SelectMany 호출로 변환됩니다.

추가 정보

적용 대상

SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>)

시퀀스의 각 요소를 IEnumerable<T>투영하고 결과 시퀀스를 하나의 시퀀스로 평면화합니다. 각 원본 요소의 인덱스는 해당 요소의 프로젝션된 형식으로 사용됩니다.

public:
generic <typename TSource, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ SelectMany(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, int, System::Collections::Generic::IEnumerable<TResult> ^> ^ selector);
public static System.Collections.Generic.IEnumerable<TResult> SelectMany<TSource,TResult>(this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,System.Collections.Generic.IEnumerable<TResult>> selector);
static member SelectMany : seq<'Source> * Func<'Source, int, seq<'Result>> -> seq<'Result>
<Extension()>
Public Function SelectMany(Of TSource, TResult) (source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer, IEnumerable(Of TResult))) As IEnumerable(Of TResult)

형식 매개 변수

TSource

의 요소 형식입니다 source.

TResult

에서 반환 selector하는 시퀀스 요소의 형식입니다.

매개 변수

source
IEnumerable<TSource>

프로젝트할 값의 시퀀스입니다.

selector
Func<TSource,Int32,IEnumerable<TResult>>

각 원본 요소에 적용할 변환 함수입니다. 함수의 두 번째 매개 변수는 소스 요소의 인덱스를 나타냅니다.

반품

IEnumerable<TResult>

IEnumerable<T> 해당 요소는 입력 시퀀스의 각 요소에 대해 일대다 변환 함수를 호출한 결과입니다.

예외

source 또는 selector .입니다 null.

예제

다음 코드 예제에서는 배열에 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) 대해 일 대 다 프로젝션을 수행하고 각 외부 요소의 인덱스를 사용하는 방법을 보여 줍니다.

class PetOwner
{
    public string Name { get; set; }
    public List<string> Pets { get; set; }
}

public static void SelectManyEx2()
{
    PetOwner[] petOwners =
        { new PetOwner { Name="Higa, Sidney",
              Pets = new List<string>{ "Scruffy", "Sam" } },
          new PetOwner { Name="Ashkenazi, Ronen",
              Pets = new List<string>{ "Walker", "Sugar" } },
          new PetOwner { Name="Price, Vernette",
              Pets = new List<string>{ "Scratches", "Diesel" } },
          new PetOwner { Name="Hines, Patrick",
              Pets = new List<string>{ "Dusty" } } };

    // Project the items in the array by appending the index
    // of each PetOwner to each pet's name in that petOwner's
    // array of pets.
    IEnumerable<string> query =
        petOwners.SelectMany((petOwner, index) =>
                                 petOwner.Pets.Select(pet => index + pet));

    foreach (string pet in query)
    {
        Console.WriteLine(pet);
    }
}

// This code produces the following output:
//
// 0Scruffy
// 0Sam
// 1Walker
// 1Sugar
// 2Scratches
// 2Diesel
// 3Dusty
Structure PetOwner
    Public Name As String
    Public Pets() As String
End Structure

Sub SelectManyEx2()
    ' Create an array of PetOwner objects.
    Dim petOwners() As PetOwner =
{New PetOwner With
 {.Name = "Higa, Sidney", .Pets = New String() {"Scruffy", "Sam"}},
 New PetOwner With
 {.Name = "Ashkenazi, Ronen", .Pets = New String() {"Walker", "Sugar"}},
 New PetOwner With
 {.Name = "Price, Vernette", .Pets = New String() {"Scratches", "Diesel"}},
 New PetOwner With
 {.Name = "Hines, Patrick", .Pets = New String() {"Dusty"}}}

    ' Project the items in the array by appending the index
    ' of each PetOwner to each pet's name in that petOwner's
    ' array of pets.
    Dim query As IEnumerable(Of String) =
petOwners.SelectMany(Function(petOwner, index) _
                         petOwner.Pets.Select(Function(pet) _
                                                  index.ToString() + pet))

    Dim output As New System.Text.StringBuilder
    For Each pet As String In query
        output.AppendLine(pet)
    Next

    ' Display the output.
    Console.WriteLine(output.ToString())
End Sub

설명

이 메서드는 지연된 실행을 사용하여 구현됩니다. 즉시 반환 값은 작업을 수행하는 데 필요한 모든 정보를 저장하는 개체입니다. 이 메서드가 나타내는 쿼리는 해당 GetEnumerator 메서드를 직접 호출하거나 C#의 foreach 또는 Visual Basic For Each 사용하여 개체가 열거될 때까지 실행되지 않습니다.

이 메서드는 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) 입력 시퀀스를 열거하고, 변환 함수를 사용하여 각 요소를 매핑 IEnumerable<T>한 다음, 이러한 IEnumerable<T> 각 개체의 요소를 열거하고 생성합니다. 즉, 각 요소에 sourceselector 대해 호출되고 값 시퀀스가 반환됩니다. SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) 그런 다음 이 2차원 컬렉션 컬렉션을 1차원 IEnumerable<T> 으로 평면화하고 반환합니다. 예를 들어 쿼리가 SelectMany<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,IEnumerable<TResult>>) 사용하여 데이터베이스의 각 고객에 대한 주문(Order 형식)을 가져오는 경우 결과는 C#의 IEnumerable<Order> 또는 Visual Basic IEnumerable(Of Order) 형식입니다. 대신 쿼리가 Select 사용하여 주문을 가져오는 경우 주문 컬렉션 컬렉션이 결합되지 않고 결과는 C#의 IEnumerable<List<Order>> 형식이거나 Visual Basic IEnumerable(Of List(Of Order)) 형식입니다.

처리할 selector 요소를 나타내는 첫 번째 인수입니다. 소스 시퀀스에서 해당 요소의 인덱스(0부터 시작하는 인덱스)를 나타내는 두 번째 인수 selector 입니다. 예를 들어 요소가 알려진 순서에 있고 특정 인덱스에서 요소를 사용하여 작업을 수행하려는 경우에 유용할 수 있습니다. 하나 이상의 요소의 인덱스 검색을 원하는 경우에도 유용할 수 있습니다.

적용 대상