Enumerable.GroupJoin 方法

定义

基于键值等同性将两个序列的元素进行关联,并对结果进行分组。Correlates the elements of two sequences based on key equality, and groups the results.

重载

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

基于键值等同性对两个序列的元素进行关联,并对结果进行分组。Correlates the elements of two sequences based on key equality and groups the results. 使用指定的 IEqualityComparer<T> 对键进行比较。A specified IEqualityComparer<T> 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>)

基于键值等同性对两个序列的元素进行关联,并对结果进行分组。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>)

基于键值等同性对两个序列的元素进行关联,并对结果进行分组。Correlates the elements of two sequences based on key equality and groups the results. 使用指定的 IEqualityComparer<T> 对键进行比较。A specified IEqualityComparer<T> is used to compare keys.

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

第一个序列中的元素的类型。The type of the elements of the first sequence.

TInner

第二个序列中的元素的类型。The type of the elements of the second sequence.

TKey

键选择器函数返回的键的类型。The type of the keys returned by the key selector functions.

TResult

结果元素的类型。The type of the result elements.

参数

outer
IEnumerable<TOuter>

要联接的第一个序列。The first sequence to join.

inner
IEnumerable<TInner>

要与第一个序列联接的序列。The sequence to join to the first sequence.

outerKeySelector
Func<TOuter,TKey>

用于从第一个序列的每个元素提取联接键的函数。A function to extract the join key from each element of the first sequence.

innerKeySelector
Func<TInner,TKey>

用于从第二个序列的每个元素提取联接键的函数。A function to extract the join key from each element of the second sequence.

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

用于从第一个序列的元素和第二个序列的匹配元素集合中创建结果元素的函数。A function to create a result element from an element from the first sequence and a collection of matching elements from the second sequence.

comparer
IEqualityComparer<TKey>

用于对键进行哈希处理和比较的 IEqualityComparer<T>An IEqualityComparer<T> to hash and compare keys.

返回

IEnumerable<TResult>

一个包含通过对两个序列执行分组联接获得的类型为 TResult 的元素的 IEnumerable<T>An IEnumerable<T> that contains elements of type TResult that are obtained by performing a grouped join on two sequences.

例外

outerinnerouterKeySelectorinnerKeySelectorresultSelectornullouter or inner or outerKeySelector or innerKeySelector or resultSelector is null.

注解

此方法是使用延迟执行实现的。This method is implemented by using deferred execution. 即时返回值是一个对象,该对象存储执行操作所需的所有信息。The immediate return value is an object that stores all the information that is required to perform the action. 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator 方法,或者通过 foreach 在 Visual c # 中使用或 For Each 在 Visual Basic 中使用。The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

如果 comparernull ,则使用默认的相等比较器 Default 对键进行哈希运算。If comparer is null, the default equality comparer, Default, is used to hash and compare keys.

GroupJoin 生成分层结果,这意味着中的元素 outer 与中匹配元素的集合配对 innerGroupJoin produces hierarchical results, which means that elements from outer are paired with collections of matching elements from inner. GroupJoin 使您能够基于的每个元素的整个匹配项集生成结果 outerGroupJoin enables you to base your results on a whole set of matches for each element of outer.

备注

如果的给定元素在中没有关联元素 inner outer ,则该元素的匹配序列将为空,但仍会出现在结果中。If there are no correlated elements in inner for a given element of outer, the sequence of matches for that element will be empty but will still appear in the results.

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 innerThis 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 匹配元素的顺序 innerGroupJoin 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>)

基于键值等同性对两个序列的元素进行关联,并对结果进行分组。Correlates the elements of two sequences based on equality of keys and groups the results. 使用默认的相等比较器对键进行比较。The default equality comparer is used to compare keys.

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

第一个序列中的元素的类型。The type of the elements of the first sequence.

TInner

第二个序列中的元素的类型。The type of the elements of the second sequence.

TKey

键选择器函数返回的键的类型。The type of the keys returned by the key selector functions.

TResult

结果元素的类型。The type of the result elements.

参数

outer
IEnumerable<TOuter>

要联接的第一个序列。The first sequence to join.

inner
IEnumerable<TInner>

要与第一个序列联接的序列。The sequence to join to the first sequence.

outerKeySelector
Func<TOuter,TKey>

用于从第一个序列的每个元素提取联接键的函数。A function to extract the join key from each element of the first sequence.

innerKeySelector
Func<TInner,TKey>

用于从第二个序列的每个元素提取联接键的函数。A function to extract the join key from each element of the second sequence.

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

用于从第一个序列的元素和第二个序列的匹配元素集合中创建结果元素的函数。A function to create a result element from an element from the first sequence and a collection of matching elements from the second sequence.

返回

IEnumerable<TResult>

一个包含通过对两个序列执行分组联接获得的类型为 TResult 的元素的 IEnumerable<T>An IEnumerable<T> that contains elements of type TResult that are obtained by performing a grouped join on two sequences.

例外

outerinnerouterKeySelectorinnerKeySelectorresultSelectornullouter or inner or outerKeySelector or innerKeySelector or resultSelector is null.

示例

下面的代码示例演示如何使用 GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>,TResult>) 对两个序列执行分组联接。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
 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

注解

此方法是使用延迟执行实现的。This method is implemented by using deferred execution. 即时返回值是一个对象,该对象存储执行操作所需的所有信息。The immediate return value is an object that stores all the information that is required to perform the action. 此方法表示的查询在枚举对象之前不会执行,方法是直接调用其 GetEnumerator 方法,或者通过 foreach 在 Visual c # 中使用或 For Each 在 Visual Basic 中使用。The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

默认的相等比较器 Default 用于对键进行哈希处理和比较。The default equality comparer, Default, is used to hash and compare keys.

GroupJoin 生成分层结果,这意味着中的元素 outer 与中匹配元素的集合配对 innerGroupJoin produces hierarchical results, which means that elements from outer are paired with collections of matching elements from inner. GroupJoin 使您能够基于的每个元素的整个匹配项集生成结果 outerGroupJoin enables you to base your results on a whole set of matches for each element of outer.

备注

如果的给定元素在中没有关联元素 inner outer ,则该元素的匹配序列将为空,但仍会出现在结果中。If there are no correlated elements in inner for a given element of outer, the sequence of matches for that element will be empty but will still appear in the results.

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 innerThis 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 匹配元素的顺序 innerGroupJoin 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.

在查询表达式语法中, join … into (Visual c # ) 或 Group Join (Visual Basic) 子句转换为对的调用 GroupJoinIn query expression syntax, a join … into (Visual C#) or Group Join (Visual Basic) clause translates to an invocation of GroupJoin.

另请参阅

适用于