Enumerable.GroupJoin 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
基于键值等同性将两个序列的元素进行关联,并对结果进行分组。
重载
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>
用于从第一个序列的元素和第二个序列的匹配元素集合中创建结果元素的函数。
返回
一个包含通过对两个序列执行分组联接获得的类型为 TResult
的元素的 IEnumerable<T>。
例外
outer
或 inner
或 outerKeySelector
或 innerKeySelector
或 resultSelector
为 null
。
示例
下面的代码示例演示如何使用 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# For Each
或 foreach
Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。
默认相等比较器 Default用于对键进行哈希处理和比较。
GroupJoin 生成分层结果,这意味着 中的 outer
元素与 中的 inner
匹配元素的集合配对。 GroupJoin
使你能够将结果基于 的每个元素 outer
的一组匹配项。
注意
如果 中的 inner
给定元素没有相关元素,则该元素 outer
的匹配序列将为空,但仍会显示在结果中。
对于resultSelector
每个outer
元素和与该元素匹配outer
的所有inner
元素的集合,仅调用该函数一次。 这与 方法不同 Join ,方法中,结果选择器函数对包含 一个 元素和 一个 来自 outer
inner
的元素的对调用。
GroupJoin
保留 元素 outer
的顺序,对于 的每个元素 outer
,保留 中 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>。
返回
一个包含通过对两个序列执行分组联接获得的类型为 TResult
的元素的 IEnumerable<T>。
例外
outer
或 inner
或 outerKeySelector
或 innerKeySelector
或 resultSelector
为 null
。
注解
此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator
其方法或通过在 C# For Each
或 foreach
Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。
如果 comparer
为 null
,则使用默认相等比较器 Default对键进行哈希处理和比较。
GroupJoin 生成分层结果,这意味着 中的 outer
元素与 中的 inner
匹配元素的集合配对。 GroupJoin
使你能够将结果基于 的每个元素 outer
的一组匹配项。
注意
如果 中的 inner
给定元素没有相关元素,则该元素 outer
的匹配序列将为空,但仍会显示在结果中。
对于resultSelector
每个outer
元素和与该元素匹配outer
的所有inner
元素的集合,仅调用该函数一次。 这与方法不同, Join 该方法对包含 一个 元素和 一个 来自 outer
inner
的元素的对调用结果选择器函数。
GroupJoin
保留 元素 outer
的顺序,对于 的每个元素 outer
,保留 中 inner
匹配元素的顺序。
GroupJoin 在传统关系数据库术语中没有直接等效项。 但是,此方法实现了内部联接和左外部联接的超集。 这两个操作都可以按照分组联接进行编写。 有关详细信息,请参阅 联接操作。