Enumerable.SelectMany 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
시퀀스의 각 요소를 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<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>>) 개체 TCollection 로 TSource 다시 이동할 수 있습니다.
쿼리 식 구문에서 각 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<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>>) 개체 TCollection 로 TSource 다시 이동할 수 있습니다.
적용 대상
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<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<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 입니다. 예를 들어 요소가 알려진 순서에 있고 특정 인덱스에서 요소를 사용하여 작업을 수행하려는 경우에 유용할 수 있습니다. 하나 이상의 요소의 인덱스 검색을 원하는 경우에도 유용할 수 있습니다.