Enumerable.Join 方法

定义

基于匹配键对两个序列的元素进行关联。Correlates the elements of two sequences based on matching keys.

重载

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

基于匹配键对两个序列的元素进行关联。Correlates the elements of two sequences based on matching keys. 使用默认的相等比较器对键进行比较。The default equality comparer is used to compare keys.

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

基于匹配键对两个序列的元素进行关联。Correlates the elements of two sequences based on matching keys. 使用指定的 IEqualityComparer<T> 对键进行比较。A specified IEqualityComparer<T> is used to compare keys.

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

基于匹配键对两个序列的元素进行关联。Correlates the elements of two sequences based on matching keys. 使用默认的相等比较器对键进行比较。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> ^ Join(System::Collections::Generic::IEnumerable<TOuter> ^ outer, System::Collections::Generic::IEnumerable<TInner> ^ inner, Func<TOuter, TKey> ^ outerKeySelector, Func<TInner, TKey> ^ innerKeySelector, Func<TOuter, TInner, TResult> ^ resultSelector);
public static System.Collections.Generic.IEnumerable<TResult> Join<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,TInner,TResult> resultSelector);
static member Join : seq<'Outer> * seq<'Inner> * Func<'Outer, 'Key> * Func<'Inner, 'Key> * Func<'Outer, 'Inner, 'Result> -> seq<'Result>
<Extension()>
Public Function Join(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, 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,TInner,TResult>

用于从两个匹配元素创建结果元素的函数。A function to create a result element from two matching elements.

返回

IEnumerable<TResult>

一个 IEnumerable<T>,其中包含通过对两个序列执行内部联接获得的、类型为 TResult 的元素。An IEnumerable<T> that has elements of type TResult that are obtained by performing an inner join on two sequences.

例外

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

示例

下面的代码示例演示如何使用 Join<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,TInner,TResult>) 基于公共键执行两个序列的内部联接。The following code example demonstrates how to use Join<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,TInner,TResult>) to perform an inner join of two sequences based on a common key.

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

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

public static void JoinEx1()
{
    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 of Person-Pet pairs where 
    // each element is an anonymous type that contains a
    // Pet's name and the name of the Person that owns the Pet.
    var query =
        people.Join(pets,
                    person => person,
                    pet => pet.Owner,
                    (person, pet) =>
                        new { OwnerName = person.Name, Pet = pet.Name });

    foreach (var obj in query)
    {
        Console.WriteLine(
            "{0} - {1}",
            obj.OwnerName,
            obj.Pet);
    }
}

/*
 This code produces the following output:

 Hedlund, Magnus - Daisy
 Adams, Terry - Barley
 Adams, Terry - 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 JoinEx1()
    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 list of Person-Pet pairs, where each element is an
    ' anonymous type that contains a Pet's name and the name of the 
    ' Person that owns the Pet.
    Dim query =
people.Join(pets,
            Function(person) person,
            Function(pet) pet.Owner,
            Function(person, pet) _
                New With {.OwnerName = person.Name, .Pet = pet.Name})

    Dim output As New System.Text.StringBuilder
    For Each obj In query
        output.AppendLine(obj.OwnerName & " - " & obj.Pet)
    Next

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

' This code produces the following output:
'
' Hedlund, Magnus - Daisy
' Adams, Terry - Barley
' Adams, Terry - 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.

联接是指基于公共键关联两个信息源的元素的操作。A join refers to the operation of correlating the elements of two sources of information based on a common key. Join 在一次方法调用中引入了两个信息源和它们一起匹配的密钥。Join brings the two information sources and the keys by which they are matched together in one method call. 这不同于使用 SelectMany,后者要求使用多个方法调用来执行相同的操作。This differs from the use of SelectMany, which requires more than one method call to perform the same operation.

Join 保留了 outer的元素的顺序,并为这些元素中的每个元素保留了 inner匹配元素的顺序。Join preserves the order of the elements of outer, and for each of these elements, the order of the matching elements of inner.

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

在关系数据库术语中,Join 方法实现内部同等联接。In relational database terms, the Join method implements an inner equijoin. "内部" 表示结果中只包括具有其他序列中的匹配项的元素。'Inner' means that only elements that have a match in the other sequence are included in the results. "同等联接" 是一种联接,其中的键进行比较以确定是否相等。An 'equijoin' is a join in which the keys are compared for equality. 左外部联接操作没有专用的标准查询运算符,但可以通过使用 GroupJoin 方法来执行。A left outer join operation has no dedicated standard query operator, but can be performed by using the GroupJoin method. 请参阅联接操作See Join Operations.

另请参阅

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

基于匹配键对两个序列的元素进行关联。Correlates the elements of two sequences based on matching keys. 使用指定的 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> ^ Join(System::Collections::Generic::IEnumerable<TOuter> ^ outer, System::Collections::Generic::IEnumerable<TInner> ^ inner, Func<TOuter, TKey> ^ outerKeySelector, Func<TInner, TKey> ^ innerKeySelector, Func<TOuter, TInner, TResult> ^ resultSelector, System::Collections::Generic::IEqualityComparer<TKey> ^ comparer);
public static System.Collections.Generic.IEnumerable<TResult> Join<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,TInner,TResult> resultSelector, System.Collections.Generic.IEqualityComparer<TKey> comparer);
static member Join : seq<'Outer> * seq<'Inner> * Func<'Outer, 'Key> * Func<'Inner, 'Key> * Func<'Outer, 'Inner, 'Result> * System.Collections.Generic.IEqualityComparer<'Key> -> seq<'Result>
<Extension()>
Public Function Join(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, 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,TInner,TResult>

用于从两个匹配元素创建结果元素的函数。A function to create a result element from two matching elements.

comparer
IEqualityComparer<TKey>

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

返回

IEnumerable<TResult>

一个 IEnumerable<T>,其中包含通过对两个序列执行内部联接获得的、类型为 TResult 的元素。An IEnumerable<T> that has elements of type TResult that are obtained by performing an inner 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.

联接是指基于公共键关联两个信息源的元素的操作。A join refers to the operation of correlating the elements of two sources of information based on a common key. Join 在一次方法调用中引入了两个信息源和它们一起匹配的密钥。Join brings the two information sources and the keys by which they are matched together in one method call. 这不同于使用 SelectMany,后者要求使用多个方法调用来执行相同的操作。This differs from the use of SelectMany, which requires more than one method call to perform the same operation.

Join 保留了 outer的元素的顺序,并为这些元素中的每个元素保留了 inner匹配元素的顺序。Join preserves the order of the elements of outer, and for each of these elements, the order of the matching elements of inner.

在关系数据库术语中,Join 方法实现内部同等联接。In relational database terms, the Join method implements an inner equijoin. "内部" 表示结果中只包括具有其他序列中的匹配项的元素。'Inner' means that only elements that have a match in the other sequence are included in the results. "同等联接" 是一种联接,其中的键进行比较以确定是否相等。An 'equijoin' is a join in which the keys are compared for equality. 左外部联接操作没有专用的标准查询运算符,但可以通过使用 GroupJoin 方法来执行。A left outer join operation has no dedicated standard query operator, but can be performed by using the GroupJoin method. 请参阅联接操作See Join Operations.

另请参阅

适用于