Enumerable.GroupJoin 메서드

정의

키가 같은지 여부에 따라 두 시퀀스의 요소를 연관시키고 결과를 그룹화합니다.

오버로드

GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>)

키가 같은지 여부에 따라 두 시퀀스의 요소를 연관시키고 결과를 그룹화합니다. 기본 같음 비교자를 사용하여 키를 비교합니다.

GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>, IEqualityComparer<TKey>)

키가 같은지 여부에 따라 두 시퀀스의 요소를 연관시키고 결과를 그룹화합니다. 지정된 IEqualityComparer<T>를 사용하여 키를 비교합니다.

GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>)

키가 같은지 여부에 따라 두 시퀀스의 요소를 연관시키고 결과를 그룹화합니다. 기본 같음 비교자를 사용하여 키를 비교합니다.

public:
generic <typename TOuter, typename TInner, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ GroupJoin(System::Collections::Generic::IEnumerable<TOuter> ^ outer, System::Collections::Generic::IEnumerable<TInner> ^ inner, Func<TOuter, TKey> ^ outerKeySelector, Func<TInner, TKey> ^ innerKeySelector, Func<TOuter, System::Collections::Generic::IEnumerable<TInner> ^, TResult> ^ resultSelector);
public static System.Collections.Generic.IEnumerable<TResult> GroupJoin<TOuter,TInner,TKey,TResult> (this System.Collections.Generic.IEnumerable<TOuter> outer, System.Collections.Generic.IEnumerable<TInner> inner, Func<TOuter,TKey> outerKeySelector, Func<TInner,TKey> innerKeySelector, Func<TOuter,System.Collections.Generic.IEnumerable<TInner>,TResult> resultSelector);
static member GroupJoin : seq<'Outer> * seq<'Inner> * Func<'Outer, 'Key> * Func<'Inner, 'Key> * Func<'Outer, seq<'Inner>, 'Result> -> seq<'Result>
<Extension()>
Public Function GroupJoin(Of TOuter, TInner, TKey, TResult) (outer As IEnumerable(Of TOuter), inner As IEnumerable(Of TInner), outerKeySelector As Func(Of TOuter, TKey), innerKeySelector As Func(Of TInner, TKey), resultSelector As Func(Of TOuter, IEnumerable(Of TInner), TResult)) As IEnumerable(Of TResult)

형식 매개 변수

TOuter

첫 번째 시퀀스 요소의 형식입니다.

TInner

두 번째 시퀀스 요소의 형식입니다.

TKey

키 선택기 함수에서 반환하는 키의 형식입니다.

TResult

결과 요소의 형식입니다.

매개 변수

outer
IEnumerable<TOuter>

조인할 첫 번째 시퀀스입니다.

inner
IEnumerable<TInner>

첫 번째 시퀀스에 조인할 시퀀스입니다.

outerKeySelector
Func<TOuter,TKey>

첫 번째 시퀀스의 각 요소에서 조인 키를 추출하는 함수입니다.

innerKeySelector
Func<TInner,TKey>

두 번째 시퀀스의 각 요소에서 조인 키를 추출하는 함수입니다.

resultSelector
Func<TOuter,IEnumerable<TInner>,TResult>

첫 번째 시퀀스의 요소와 두 번째 시퀀스의 일치하는 요소 컬렉션을 통해 결과 요소를 만들 함수입니다.

반환

IEnumerable<TResult>

두 시퀀스에 대해 그룹화 조인을 수행하여 가져온 TResult 형식 요소가 들어 있는 IEnumerable<T>입니다.

예외

outer, inner, outerKeySelector, innerKeySelector 또는 resultSelectornull인 경우

예제

다음 코드 예제에서는 를 사용하여 GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>) 두 시퀀스에서 그룹화된 조인을 수행하는 방법을 보여 줍니다.

class Person
{
    public string Name { get; set; }
}

class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}

public static void GroupJoinEx1()
{
    Person magnus = new Person { Name = "Hedlund, Magnus" };
    Person terry = new Person { Name = "Adams, Terry" };
    Person charlotte = new Person { Name = "Weiss, Charlotte" };

    Pet barley = new Pet { Name = "Barley", Owner = terry };
    Pet boots = new Pet { Name = "Boots", Owner = terry };
    Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
    Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

    List<Person> people = new List<Person> { magnus, terry, charlotte };
    List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };

    // Create a list where each element is an anonymous
    // type that contains a person's name and
    // a collection of names of the pets they own.
    var query =
        people.GroupJoin(pets,
                         person => person,
                         pet => pet.Owner,
                         (person, petCollection) =>
                             new
                             {
                                 OwnerName = person.Name,
                                 Pets = petCollection.Select(pet => pet.Name)
                             });

    foreach (var obj in query)
    {
        // Output the owner's name.
        Console.WriteLine("{0}:", obj.OwnerName);
        // Output each of the owner's pet's names.
        foreach (string pet in obj.Pets)
        {
            Console.WriteLine("  {0}", pet);
        }
    }
}

/*
 This code produces the following output:

 Hedlund, Magnus:
   Daisy
 Adams, Terry:
   Barley
   Boots
 Weiss, Charlotte:
   Whiskers
*/
Structure Person
    Public Name As String
End Structure

Structure Pet
    Public Name As String
    Public Owner As Person
End Structure

Sub GroupJoinEx1()
    Dim magnus As New Person With {.Name = "Hedlund, Magnus"}
    Dim terry As New Person With {.Name = "Adams, Terry"}
    Dim charlotte As New Person With {.Name = "Weiss, Charlotte"}

    Dim barley As New Pet With {.Name = "Barley", .Owner = terry}
    Dim boots As New Pet With {.Name = "Boots", .Owner = terry}
    Dim whiskers As New Pet With {.Name = "Whiskers", .Owner = charlotte}
    Dim daisy As New Pet With {.Name = "Daisy", .Owner = magnus}

    Dim people As New List(Of Person)(New Person() {magnus, terry, charlotte})
    Dim pets As New List(Of Pet)(New Pet() {barley, boots, whiskers, daisy})

    ' Create a collection where each element is an anonymous type
    ' that contains a Person's name and a collection of names of
    ' the pets that are owned by them.
    Dim query =
people.GroupJoin(pets,
           Function(person) person,
           Function(pet) pet.Owner,
           Function(person, petCollection) _
               New With {.OwnerName = person.Name,
                         .Pets = petCollection.Select(
                                            Function(pet) pet.Name)})

    Dim output As New System.Text.StringBuilder
    For Each obj In query
        ' Output the owner's name.
        output.AppendLine(obj.OwnerName & ":")
        ' Output each of the owner's pet's names.
        For Each pet As String In obj.Pets
            output.AppendLine("  " & pet)
        Next
    Next

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

' This code produces the following output:
'
' Hedlund, Magnus
'   Daisy
' Adams, Terry
'   Barley
'   Boots
' Weiss, Charlotte
'   Whiskers

설명

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

기본 같음 비교자 는 Default키를 해시하고 비교하는 데 사용됩니다.

GroupJoin 는 계층적 결과를 생성합니다. 즉, 의 요소는 에서 outer 일치하는 요소 inner의 컬렉션과 쌍을 이집니다. GroupJoin 를 사용하면 의 각 요소 outer에 대한 전체 일치 집합에 대한 결과를 기반으로 할 수 있습니다.

참고

의 지정된 요소에 inner 대해 에 상관 관계가 있는 요소가 없으면 해당 요소 outer에 대한 일치 시퀀스는 비어 있지만 결과에 계속 표시됩니다.

함수는 resultSelector 요소와 일치하는 outer 모든 요소의 컬렉션과 함께 각 outer 요소에 inner 대해 한 번만 호출됩니다. 이는 의 요소 하나와 의 요소를 outer 포함하는 쌍에서 결과 선택기 함수가 호출되는 메서드와 inner다릅니다Join.

GroupJoin 는 의 요소 outer순서를 유지하고 의 각 요소 outer에 대해 에서 inner일치하는 요소의 순서를 유지합니다.

GroupJoin에는 기존 관계형 데이터베이스 용어에 직접적으로 해당하는 항목이 없습니다. 그러나 이 메서드는 내부 조인 및 왼쪽 우선 외부 조인의 상위 집합을 구현합니다. 이러한 작업은 모두 그룹화된 조인과 관련하여 작성할 수 있습니다. 자세한 내용은 조인 작업을 참조하세요.

쿼리 식 구문 join ... into 에서 (C#) 또는 Group Join (Visual Basic) 절은 의 GroupJoin호출로 변환됩니다.

추가 정보

적용 대상

GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>, IEqualityComparer<TKey>)

키가 같은지 여부에 따라 두 시퀀스의 요소를 연관시키고 결과를 그룹화합니다. 지정된 IEqualityComparer<T>를 사용하여 키를 비교합니다.

public:
generic <typename TOuter, typename TInner, typename TKey, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ GroupJoin(System::Collections::Generic::IEnumerable<TOuter> ^ outer, System::Collections::Generic::IEnumerable<TInner> ^ inner, Func<TOuter, TKey> ^ outerKeySelector, Func<TInner, TKey> ^ innerKeySelector, Func<TOuter, System::Collections::Generic::IEnumerable<TInner> ^, TResult> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Collections.Generic.IEnumerable<TResult> GroupJoin<TOuter,TInner,TKey,TResult> (this System.Collections.Generic.IEnumerable<TOuter> outer, System.Collections.Generic.IEnumerable<TInner> inner, Func<TOuter,TKey> outerKeySelector, Func<TInner,TKey> innerKeySelector, Func<TOuter,System.Collections.Generic.IEnumerable<TInner>,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
public static System.Collections.Generic.IEnumerable<TResult> GroupJoin<TOuter,TInner,TKey,TResult> (this System.Collections.Generic.IEnumerable<TOuter> outer, System.Collections.Generic.IEnumerable<TInner> inner, Func<TOuter,TKey> outerKeySelector, Func<TInner,TKey> innerKeySelector, Func<TOuter,System.Collections.Generic.IEnumerable<TInner>,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey>? comparer);
static member GroupJoin : seq<'Outer> * seq<'Inner> * Func<'Outer, 'Key> * Func<'Inner, 'Key> * Func<'Outer, seq<'Inner>, 'Result> * System.Collections.Generic.IEqualityComparer<'Key> -> seq<'Result>
<Extension()>
Public Function GroupJoin(Of TOuter, TInner, TKey, TResult) (outer As IEnumerable(Of TOuter), inner As IEnumerable(Of TInner), outerKeySelector As Func(Of TOuter, TKey), innerKeySelector As Func(Of TInner, TKey), resultSelector As Func(Of TOuter, IEnumerable(Of TInner), TResult), comparer As IEqualityComparer(Of TKey)) As IEnumerable(Of TResult)

형식 매개 변수

TOuter

첫 번째 시퀀스 요소의 형식입니다.

TInner

두 번째 시퀀스 요소의 형식입니다.

TKey

키 선택기 함수에서 반환하는 키의 형식입니다.

TResult

결과 요소의 형식입니다.

매개 변수

outer
IEnumerable<TOuter>

조인할 첫 번째 시퀀스입니다.

inner
IEnumerable<TInner>

첫 번째 시퀀스에 조인할 시퀀스입니다.

outerKeySelector
Func<TOuter,TKey>

첫 번째 시퀀스의 각 요소에서 조인 키를 추출하는 함수입니다.

innerKeySelector
Func<TInner,TKey>

두 번째 시퀀스의 각 요소에서 조인 키를 추출하는 함수입니다.

resultSelector
Func<TOuter,IEnumerable<TInner>,TResult>

첫 번째 시퀀스의 요소와 두 번째 시퀀스의 일치하는 요소 컬렉션을 통해 결과 요소를 만들 함수입니다.

comparer
IEqualityComparer<TKey>

키를 해시하여 비교할 IEqualityComparer<T>입니다.

반환

IEnumerable<TResult>

두 시퀀스에 대해 그룹화 조인을 수행하여 가져온 TResult 형식 요소가 들어 있는 IEnumerable<T>입니다.

예외

outer, inner, outerKeySelector, innerKeySelector 또는 resultSelectornull인 경우

설명

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

가 이면 comparer 기본 같음 비교자 인 Default가 키를 해시하고 비교하는 데 null사용됩니다.

GroupJoin 는 계층적 결과를 생성합니다. 즉, 의 요소는 에서 outer 일치하는 요소 inner의 컬렉션과 쌍을 이집니다. GroupJoin 를 사용하면 의 각 요소 outer에 대한 전체 일치 집합에 대한 결과를 기반으로 할 수 있습니다.

참고

의 지정된 요소에 inner 대해 에 상관 관계가 있는 요소가 없으면 해당 요소 outer에 대한 일치 시퀀스는 비어 있지만 결과에 계속 표시됩니다.

함수는 resultSelector 요소와 일치하는 outer 모든 요소의 컬렉션과 함께 각 outer 요소에 inner 대해 한 번만 호출됩니다. 이는 의 요소 하나와 의 요소를 outer 포함하는 쌍에서 결과 선택기 함수가 호출되는 메서드와 inner다릅니다Join.

GroupJoin 는 의 요소 outer순서를 유지하고 의 각 요소 outer에 대해 에서 inner일치하는 요소의 순서를 유지합니다.

GroupJoin에는 기존 관계형 데이터베이스 용어에 직접적으로 해당하는 항목이 없습니다. 그러나 이 메서드는 내부 조인 및 왼쪽 우선 외부 조인의 상위 집합을 구현합니다. 이러한 작업은 모두 그룹화된 조인과 관련하여 작성할 수 있습니다. 자세한 내용은 조인 작업을 참조하세요.

추가 정보

적용 대상