Enumerable.GroupJoin Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Koreluje elementy dwóch sekwencji na podstawie równości klucza i grupuje wyniki.
Przeciążenia
GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>) |
Koreluje elementy dwóch sekwencji na podstawie równości kluczy i grupuje wyniki. Domyślny moduł porównywania równości służy do porównywania kluczy. |
GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>, IEqualityComparer<TKey>) |
Koreluje elementy dwóch sekwencji na podstawie równości klucza i grupuje wyniki. Określony IEqualityComparer<T> jest używany do porównywania kluczy. |
GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>)
- Źródło:
- GroupJoin.cs
- Źródło:
- GroupJoin.cs
- Źródło:
- GroupJoin.cs
Koreluje elementy dwóch sekwencji na podstawie równości kluczy i grupuje wyniki. Domyślny moduł porównywania równości służy do porównywania kluczy.
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)
Parametry typu
- TOuter
Typ elementów pierwszej sekwencji.
- TInner
Typ elementów drugiej sekwencji.
- TKey
Typ kluczy zwracanych przez funkcje przełącznika kluczowego.
- TResult
Typ elementów wyniku.
Parametry
- outer
- IEnumerable<TOuter>
Pierwsza sekwencja do przyłączenia.
- inner
- IEnumerable<TInner>
Sekwencja do przyłączenia do pierwszej sekwencji.
- outerKeySelector
- Func<TOuter,TKey>
Funkcja wyodrębniania klucza łączenia z każdego elementu pierwszej sekwencji.
- innerKeySelector
- Func<TInner,TKey>
Funkcja wyodrębniania klucza łączenia z każdego elementu drugiej sekwencji.
- resultSelector
- Func<TOuter,IEnumerable<TInner>,TResult>
Funkcja umożliwiająca utworzenie elementu wyniku z elementu z pierwszej sekwencji i kolekcji pasujących elementów z drugiej sekwencji.
Zwraca
Element IEnumerable<T> zawierający elementy typu TResult
, które są uzyskiwane przez wykonanie sprzężenia zgrupowanego w dwóch sekwencjach.
Wyjątki
outer
lub inner
outerKeySelector
lub innerKeySelector
lub resultSelector
jest null
.
Przykłady
W poniższym przykładzie kodu pokazano, jak wykonać GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>) sprzężenie zgrupowane w dwóch sekwencjach.
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
Uwagi
Ta metoda jest implementowana za pomocą odroczonego wykonania. Bezpośrednio zwracana wartość jest obiektem, który przechowuje wszystkie informacje wymagane do wykonania akcji. Zapytanie reprezentowane przez tę metodę nie jest wykonywane, dopóki obiekt nie zostanie wyliczony, wywołując metodę GetEnumerator
bezpośrednio lub używając w foreach
języku C# lub For Each
w Visual Basic.
Domyślny moduł porównywania równości , Defaultsłuży do tworzenia skrótów i porównywania kluczy.
GroupJoin generuje wyniki hierarchiczne, co oznacza, że elementy z outer
elementu są sparowane z kolekcjami pasujących elementów z inner
klasy . GroupJoin
umożliwia oparcie wyników na całym zestawie dopasowań dla każdego elementu elementu outer
.
Uwaga
Jeśli dla danego elementu outer
nie ma skorelowanych elementów inner
, sekwencja dopasowań dla tego elementu będzie pusta, ale nadal będzie wyświetlana w wynikach.
Funkcja resultSelector
jest wywoływana tylko raz dla każdego outer
elementu wraz z kolekcją wszystkich inner
elementów pasujących do outer
elementu. Różni się to od Join metody, w której funkcja selektora wyników jest wywoływana w parach zawierających jeden element z outer
i jeden element z inner
.
GroupJoin
zachowuje kolejność elementów outer
, i dla każdego elementu outer
, kolejność pasujących elementów z inner
.
GroupJoin nie ma bezpośredniego odpowiednika w tradycyjnych terminach relacyjnej bazy danych. Jednak ta metoda implementuje nadzbior sprzężeń wewnętrznych i lewe sprzężenia zewnętrzne. Oba te operacje można napisać pod względem sprzężenia grupowanego. Aby uzyskać więcej informacji, zobacz Operacje dołączania.
W składni wyrażenia zapytania klauzula join ... into
(C#) lub Group Join
(Visual Basic) tłumaczy się na wywołanie GroupJoin.
Zobacz też
- Operacje sprzężenia (C#)
- Operacje sprzężenia (Visual Basic)
- Klauzula join (odwołanie w C#)
- Group Join — Klauzula (Visual Basic)
Dotyczy
GroupJoin<TOuter,TInner,TKey,TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter,TKey>, Func<TInner,TKey>, Func<TOuter,IEnumerable<TInner>, TResult>, IEqualityComparer<TKey>)
- Źródło:
- GroupJoin.cs
- Źródło:
- GroupJoin.cs
- Źródło:
- GroupJoin.cs
Koreluje elementy dwóch sekwencji na podstawie równości klucza i grupuje wyniki. Określony IEqualityComparer<T> jest używany do porównywania kluczy.
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)
Parametry typu
- TOuter
Typ elementów pierwszej sekwencji.
- TInner
Typ elementów drugiej sekwencji.
- TKey
Typ kluczy zwracanych przez funkcje przełącznika kluczowego.
- TResult
Typ elementów wyniku.
Parametry
- outer
- IEnumerable<TOuter>
Pierwsza sekwencja do przyłączenia.
- inner
- IEnumerable<TInner>
Sekwencja do przyłączenia do pierwszej sekwencji.
- outerKeySelector
- Func<TOuter,TKey>
Funkcja wyodrębniania klucza łączenia z każdego elementu pierwszej sekwencji.
- innerKeySelector
- Func<TInner,TKey>
Funkcja wyodrębniania klucza łączenia z każdego elementu drugiej sekwencji.
- resultSelector
- Func<TOuter,IEnumerable<TInner>,TResult>
Funkcja umożliwiająca utworzenie elementu wyniku z elementu z pierwszej sekwencji i kolekcji pasujących elementów z drugiej sekwencji.
- comparer
- IEqualityComparer<TKey>
Skrót IEqualityComparer<T> i porównanie kluczy.
Zwraca
Element IEnumerable<T> zawierający elementy typu TResult
, które są uzyskiwane przez wykonanie sprzężenia zgrupowanego w dwóch sekwencjach.
Wyjątki
outer
lub inner
outerKeySelector
lub innerKeySelector
lub resultSelector
jest null
.
Uwagi
Ta metoda jest implementowana za pomocą odroczonego wykonania. Bezpośrednio zwracana wartość jest obiektem, który przechowuje wszystkie informacje wymagane do wykonania akcji. Zapytanie reprezentowane przez tę metodę nie jest wykonywane, dopóki obiekt nie zostanie wyliczony, wywołując metodę GetEnumerator
bezpośrednio lub używając w foreach
języku C# lub For Each
w Visual Basic.
Jeśli comparer
jest to null
, domyślnym porównaniem równości, Defaultjest używany do skrótu i porównywania kluczy.
GroupJoin generuje wyniki hierarchiczne, co oznacza, że elementy z outer
elementu są sparowane z kolekcjami pasujących elementów z inner
klasy . GroupJoin
umożliwia oparcie wyników na całym zestawie dopasowań dla każdego elementu elementu outer
.
Uwaga
Jeśli dla danego elementu outer
nie ma skorelowanych elementów inner
, sekwencja dopasowań dla tego elementu będzie pusta, ale nadal będzie wyświetlana w wynikach.
Funkcja resultSelector
jest wywoływana tylko raz dla każdego outer
elementu wraz z kolekcją wszystkich inner
elementów pasujących do outer
elementu. Różni się to od Join metody, w której funkcja selektora wyników jest wywoływana w parach zawierających jeden element z outer
i jeden element z inner
.
GroupJoin
zachowuje kolejność elementów outer
, i dla każdego elementu outer
, kolejność pasujących elementów z inner
.
GroupJoin nie ma bezpośredniego odpowiednika w tradycyjnych terminach relacyjnej bazy danych. Jednak ta metoda implementuje nadzbior sprzężeń wewnętrznych i lewe sprzężenia zewnętrzne. Oba te operacje można napisać pod względem sprzężenia grupowanego. Aby uzyskać więcej informacji, zobacz Operacje dołączania.