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

Source:
GroupJoin.cs
Source:
GroupJoin.cs
Source:
GroupJoin.cs

根據索引鍵相等與否,將兩個序列的項目相互關聯,並群組產生的結果。 預設的相等比較子是用於比較索引鍵。

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 的項目。

例外狀況

outerinnerouterKeySelectorinnerKeySelectorresultSelectornull

範例

下列程式代碼範例示範如何使用 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# 或 foreachFor Each Visual Basic 中使用 來列舉對象,否則不會執行這個方法所代表的查詢。

默認相等比較子 Default是用來哈希和比較索引鍵。

GroupJoin 會產生階層式結果,這表示 中的 outer 專案會與的 inner相符專案集合配對。 GroupJoin 可讓您根據 每個元素 outer的一組相符專案來建立結果的基礎。

注意

如果中的 inner 指定項目沒有相互關聯的元素 outer,該專案的相符序列將會是空的,但仍會出現在結果中。

resultSelector式只會針對每個outer項目呼叫一次,以及符合outer專案之所有inner元素的集合。 這與 方法不同 Join ,在此方法中,結果選取器函式會在包含一個專案 outer 的配對上叫用,以及從 中叫用 inner一個專案。

GroupJoin會保留的項目順序,以及的每個項目outerouter的順序,以及的相符項目順序。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>)

Source:
GroupJoin.cs
Source:
GroupJoin.cs
Source:
GroupJoin.cs

根據索引鍵相等與否,將兩個序列的項目相互關聯,並群組產生的結果。 指定的 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>

IEnumerable<T>,其中包含透過對兩個序列執行群組聯結所取得之型別 TResult 的項目。

例外狀況

outerinnerouterKeySelectorinnerKeySelectorresultSelectornull

備註

這個方法是使用延後執行來實作。 立即傳回值是一個物件,會儲存執行動作所需的所有資訊。 除非直接呼叫其 GetEnumerator 方法或在 C# 或 foreachFor Each Visual Basic 中使用 來列舉對象,否則不會執行這個方法所代表的查詢。

如果 為 comparernull,則預設相等比較子 Default會用來哈希和比較索引鍵。

GroupJoin 會產生階層式結果,這表示 中的 outer 專案會與的 inner相符專案集合配對。 GroupJoin 可讓您根據 每個元素 outer的一組相符專案來建立結果的基礎。

注意

如果中的 inner 指定項目沒有相互關聯的元素 outer,該專案的相符序列將會是空的,但仍會出現在結果中。

resultSelector式只會針對每個outer項目呼叫一次,以及符合outer專案之所有inner元素的集合。 這與方法不同 Join ,其中結果選取器函式會叫用在包含一個專案 outer 的配對上,以及從 中叫用 inner一個專案。

GroupJoin會保留的項目順序,以及的每個項目outerouter的順序,以及的相符項目順序。inner

GroupJoin 在傳統關聯式資料庫詞彙中沒有直接對等項目。 不過,此方法確實會實作內部聯結和左方外部聯結的超集。 這兩項作業都會以分組聯結的方式撰寫。 如需詳細資訊,請參閱 聯結作業

另請參閱

適用於