Enumerable.GroupJoin Metoda

Definicja

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>)

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

IEnumerable<TResult>

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 innerouterKeySelector 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 innerklasy . GroupJoin umożliwia oparcie wyników na całym zestawie dopasowań dla każdego elementu elementu outer.

Uwaga

Jeśli dla danego elementu outernie 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ż

Dotyczy

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.

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

IEnumerable<TResult>

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 innerouterKeySelector 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 innerklasy . GroupJoin umożliwia oparcie wyników na całym zestawie dopasowań dla każdego elementu elementu outer.

Uwaga

Jeśli dla danego elementu outernie 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.

Zobacz też

Dotyczy