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>)
- 來源:
- GroupJoin.cs
- 來源:
- GroupJoin.cs
- 來源:
- 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>
函式,用來從第一個序列的專案建立結果專案,以及第二個序列中相符專案的集合。
傳回
IEnumerable<T>,其中包含透過在兩個序列上執行群組聯結所取得之類型 TResult
的專案。
例外狀況
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# 中使用 foreach
,或在 Visual Basic 中使用 For Each
,否則不會執行這個方法所代表的查詢。
默認相等比較子 Default用來哈希和比較索引鍵。
GroupJoin 會產生階層式結果,這表示來自 outer
的專案會與來自 inner
的相符專案集合配對。
GroupJoin
可讓您根據 outer
的每個元素的一組完整相符專案來取得結果。
注意
如果指定專案 outer
中沒有相互關聯的元素 inner
,該元素的相符序列將會是空的,但仍會出現在結果中。
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>)
- 來源:
- GroupJoin.cs
- 來源:
- GroupJoin.cs
- 來源:
- 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>。
傳回
IEnumerable<T>,其中包含透過在兩個序列上執行群組聯結所取得之類型 TResult
的專案。
例外狀況
outer
或 inner
或 outerKeySelector
或 innerKeySelector
或 resultSelector
null
。
備註
這個方法是使用延後執行來實作。 立即傳回值是物件,可儲存執行動作所需的所有資訊。 除非直接呼叫物件 GetEnumerator
方法或在 C# 中使用 foreach
,或在 Visual Basic 中使用 For Each
,否則不會執行這個方法所代表的查詢。
如果 comparer
是 null
,則會使用預設相等比較子 Default來哈希和比較索引鍵。
GroupJoin 會產生階層式結果,這表示來自 outer
的專案會與來自 inner
的相符專案集合配對。
GroupJoin
可讓您根據 outer
的每個元素的一組完整相符專案來取得結果。
注意
如果指定專案 outer
中沒有相互關聯的元素 inner
,該元素的相符序列將會是空的,但仍會出現在結果中。
resultSelector
函式只會針對每個 outer
專案呼叫一次,以及符合 outer
專案之所有 inner
元素的集合。 這與 Join 方法不同,其中結果選取器函式會在包含 outer
的配對上叫用結果選取器函式,以及一個來自 inner
的專案。
GroupJoin
會保留 outer
項目的順序,而針對 outer
的每個專案,則保留 inner
中相符專案的順序。
GroupJoin 在傳統關係資料庫詞彙中沒有直接對等專案。 不過,此方法會實作內部聯結和左外部聯接的超集。 這兩項作業都可以以群組聯結來撰寫。 如需詳細資訊,請參閱 聯結作業。