Enumerable.Join 方法

定义

基于匹配键对两个序列的元素进行关联。

重载

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

Source:
Join.cs
Source:
Join.cs
Source:
Join.cs

基于匹配键对两个序列的元素进行关联。 使用默认的相等比较器对键进行比较。

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

类型参数

TOuter

第一个序列中的元素的类型。

TInner

第二个序列中的元素的类型。

TKey

键选择器函数返回的键的类型。

TResult

结果元素的类型。

参数

outer
IEnumerable<TOuter>

要联接的第一个序列。

inner
IEnumerable<TInner>

要与第一个序列联接的序列。

outerKeySelector
Func<TOuter,TKey>

用于从第一个序列的每个元素提取联接键的函数。

innerKeySelector
Func<TInner,TKey>

用于从第二个序列的每个元素提取联接键的函数。

resultSelector
Func<TOuter,TInner,TResult>

用于从两个匹配元素创建结果元素的函数。

返回

IEnumerable<TResult>

一个 IEnumerable<T>,其中包含通过对两个序列执行内部联接获得的、类型为 TResult 的元素。

例外

outerinnerouterKeySelectorinnerKeySelectorresultSelectornull

示例

下面的代码示例演示如何使用 Join<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,TInner,TResult>) 执行基于公共键的两个序列的内部联接。

C#
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
*/

注解

此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator其方法或在 C# For Eachforeach Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。

默认相等比较器 Default用于对键进行哈希运算和比较。

联接是指基于公共键关联两个信息源的元素的操作。 Join 在一个方法调用中,将两个信息源和键一起匹配。 这与 使用 SelectMany不同,后者需要多个方法调用才能执行相同的操作。

Join 保留 的元素 outer的顺序,对于其中每个元素,保留 匹配元素的顺序 inner

在查询表达式语法中, join (C#) 或 Join (Visual Basic) 子句将转换为 的调用 Join

在关系数据库术语中 Join ,方法实现内部等价关系。 “Inner”表示结果中仅包含其他序列中匹配项的元素。 “equijoin”是一个联接,其中键在相等性方面进行比较。 左外部联接操作没有专用的标准查询运算符,但可以使用 方法执行 GroupJoin 。 有关详细信息,请参阅 联接操作

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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

Source:
Join.cs
Source:
Join.cs
Source:
Join.cs

基于匹配键对两个序列的元素进行关联。 使用指定的 IEqualityComparer<T> 对键进行比较。

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

类型参数

TOuter

第一个序列中的元素的类型。

TInner

第二个序列中的元素的类型。

TKey

键选择器函数返回的键的类型。

TResult

结果元素的类型。

参数

outer
IEnumerable<TOuter>

要联接的第一个序列。

inner
IEnumerable<TInner>

要与第一个序列联接的序列。

outerKeySelector
Func<TOuter,TKey>

用于从第一个序列的每个元素提取联接键的函数。

innerKeySelector
Func<TInner,TKey>

用于从第二个序列的每个元素提取联接键的函数。

resultSelector
Func<TOuter,TInner,TResult>

用于从两个匹配元素创建结果元素的函数。

comparer
IEqualityComparer<TKey>

用于对键进行哈希处理和比较的 IEqualityComparer<T>

返回

IEnumerable<TResult>

一个 IEnumerable<T>,其中包含通过对两个序列执行内部联接获得的、类型为 TResult 的元素。

例外

outerinnerouterKeySelectorinnerKeySelectorresultSelectornull

注解

此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator其方法或在 C# For Eachforeach Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。

如果 comparernull,则使用默认相等比较器 Default对键进行哈希和比较。

联接是指基于公共键关联两个信息源的元素的操作。 Join 在一个方法调用中,将两个信息源和键一起匹配。 这与 使用 SelectMany不同,后者需要多个方法调用才能执行相同的操作。

Join 保留 的元素 outer的顺序,对于其中每个元素,保留 匹配元素的顺序 inner

在关系数据库术语中 Join ,方法实现内部等价关系。 “Inner”表示结果中仅包含其他序列中匹配项的元素。 “equijoin”是一个联接,其中键在相等性方面进行比较。 左外部联接操作没有专用的标准查询运算符,但可以使用 方法执行 GroupJoin 。 有关详细信息,请参阅 联接操作

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0