# Enumerable.GroupJoinEnumerable.GroupJoinEnumerable.GroupJoinEnumerable.GroupJoin Method

## 多載

 GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>, IEqualityComparer) GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>, IEqualityComparer) GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>, IEqualityComparer) GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>, IEqualityComparer) 根據索引鍵相等與否，將兩個序列的項目相互關聯，並群組產生的結果。Correlates the elements of two sequences based on key equality and groups the results. 指定的 IEqualityComparer 是用於比較索引鍵。A specified IEqualityComparer is used to compare keys. GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>) GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>) GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>) GroupJoin(IEnumerable, IEnumerable, Func, Func, Func,TResult>) 根據索引鍵相等與否，將兩個序列的項目相互關聯，並群組產生的結果。Correlates the elements of two sequences based on equality of keys and groups the results. 預設的相等比較子是用於比較索引鍵。The default equality comparer is used to compare keys.

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

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

#### 傳回

IEnumerable<TResult>

IEnumerable<T>，其中包含透過對兩個序列執行群組聯結所取得之型別 `TResult` 的項目。An IEnumerable<T> that contains elements of type `TResult` that are obtained by performing a grouped join on two sequences.

#### 例外狀況

`outer``inner``outerKeySelector``innerKeySelector``resultSelector``null``outer` or `inner` or `outerKeySelector` or `innerKeySelector` or `resultSelector` is `null`.

### 備註

GroupJoin 產生階層式結果，這表示中的項目`outer`會與集合的相符項目配對`inner`GroupJoin produces hierarchical results, which means that elements from `outer` are paired with collections of matching elements from `inner`. `GroupJoin` 可讓您根據整組相符項目，每個項目結果`outer``GroupJoin` enables you to base your results on a whole set of matches for each element of `outer`.

`resultSelector`函式會呼叫一次，每個`outer`項目與所有集合`inner`相符的項目`outer`項目。The `resultSelector` function is called only one time for each `outer` element together with a collection of all the `inner` elements that match the `outer` element. 這不同於Join方法中結果選取器函式會叫用包含一個項目配對`outer`和 從一個項目`inner`This differs from the Join method in which the result selector function is invoked on pairs that contain one element from `outer` and one element from `inner`.

`GroupJoin` 保留的項目順序`outer`，和每個項目`outer`，從相符項目的順序`inner``GroupJoin` preserves the order of the elements of `outer`, and for each element of `outer`, the order of the matching elements from `inner`.

GroupJoin 在傳統的關聯式資料庫詞彙中有沒有直接的對等。GroupJoin has no direct equivalent in traditional relational database terms. 不過，這個方法會實作內部聯結和左方外部聯結的超集。However, this method does implement a superset of inner joins and left outer joins. 這兩種作業可以撰寫以使用群組聯結。Both of these operations can be written in terms of a grouped join. 請參閱聯結作業See Join Operations.

## 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>)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>)

``````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>

IEnumerable<T>，其中包含透過對兩個序列執行群組聯結所取得之型別 `TResult` 的項目。An IEnumerable<T> that contains elements of type `TResult` that are obtained by performing a grouped join on two sequences.

#### 例外狀況

`outer``inner``outerKeySelector``innerKeySelector``resultSelector``null``outer` or `inner` or `outerKeySelector` or `innerKeySelector` or `resultSelector` is `null`.

### 範例

The following code example demonstrates how to use GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>,TResult>) to perform a grouped join on two sequences.

``````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
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.
MsgBox(output.ToString)
End Sub

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

### 備註

GroupJoin 產生階層式結果，這表示中的項目`outer`會與集合的相符項目配對`inner`GroupJoin produces hierarchical results, which means that elements from `outer` are paired with collections of matching elements from `inner`. `GroupJoin` 可讓您根據整組相符項目，每個項目結果`outer``GroupJoin` enables you to base your results on a whole set of matches for each element of `outer`.

`resultSelector`函式會呼叫一次，每個`outer`項目與所有集合`inner`相符的項目`outer`項目。The `resultSelector` function is called only one time for each `outer` element together with a collection of all the `inner` elements that match the `outer` element. 這不同於Join方法，在其中結果選取器函式會叫用包含一個項目配對`outer`和 從一個項目`inner`This differs from the Join method, in which the result selector function is invoked on pairs that contain one element from `outer` and one element from `inner`.

`GroupJoin` 保留的項目順序`outer`，和每個項目`outer`，從相符項目的順序`inner``GroupJoin` preserves the order of the elements of `outer`, and for each element of `outer`, the order of the matching elements from `inner`.

GroupJoin 在傳統的關聯式資料庫詞彙中有沒有直接的對等。GroupJoin has no direct equivalent in traditional relational database terms. 不過，這個方法會實作內部聯結和左方外部聯結的超集。However, this method does implement a superset of inner joins and left outer joins. 這兩種作業可以撰寫以使用群組聯結。Both of these operations can be written in terms of a grouped join. 請參閱聯結作業See Join Operations.