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);
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 方法或在 Visual Basic 中使用视觉C#对象中的 foreachFor Each 来枚举对象。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.

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

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.

备注

如果 outer的给定元素 inner 中没有相关元素,则该元素的匹配序列将为空,但仍会出现在结果中。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.

对于每个 outer 元素,只调用 resultSelector 函数一次,同时调用与 outer 元素匹配的所有 inner 元素的集合。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>)

基于键值等同性对两个序列的元素进行关联,并对结果进行分组。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 方法或在 Visual Basic 中使用视觉C#对象中的 foreachFor Each 来枚举对象。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 的元素与 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.

备注

如果 outer的给定元素 inner 中没有相关元素,则该元素的匹配序列将为空,但仍会出现在结果中。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.

对于每个 outer 元素,只调用 resultSelector 函数一次,同时调用与 outer 元素匹配的所有 inner 元素的集合。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.

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

另请参阅

适用于