Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Metodo Enumerable.GroupJoin<TOuter, TInner, TKey, TResult> (IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, IEnumerable<TInner>, TResult>)

Correla gli elementi di due sequenze in base all'uguaglianza delle chiavi e raggruppa i risultati. Per confrontare le chiavi viene utilizzato l'operatore di confronto di uguaglianza predefinito.

Spazio dei nomi:  System.Linq
Assembly:  System.Core (in System.Core.dll)

public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(
	this IEnumerable<TOuter> outer,
	IEnumerable<TInner> inner,
	Func<TOuter, TKey> outerKeySelector,
	Func<TInner, TKey> innerKeySelector,
	Func<TOuter, IEnumerable<TInner>, TResult> resultSelector
)

Parametri di tipo

TOuter

Tipo degli elementi della prima sequenza.

TInner

Tipo degli elementi della seconda sequenza.

TKey

Tipo delle chiavi restituite dalle funzioni del selettore principale.

TResult

Tipo degli elementi di risultato.

Parametri

outer
Tipo: System.Collections.Generic.IEnumerable<TOuter>
Prima sequenza da unire.
inner
Tipo: System.Collections.Generic.IEnumerable<TInner>
Sequenza da unire alla prima sequenza.
outerKeySelector
Tipo: System.Func<TOuter, TKey>
Funzione per estrarre la chiave di aggiunta da ogni elemento della prima sequenza.
innerKeySelector
Tipo: System.Func<TInner, TKey>
Funzione per estrarre la chiave di aggiunta da ogni elemento della seconda sequenza.
resultSelector
Tipo: System.Func<TOuter, IEnumerable<TInner>, TResult>
Funzione per creare un elemento di risultato da un elemento dalla prima sequenza e una raccolta di elementi corrispondenti dalla seconda sequenza.

Valore restituito

Tipo: System.Collections.Generic.IEnumerable<TResult>
Oggetto IEnumerable<T> che contiene elementi di tipo TResult ottenuti eseguendo un'aggiunta raggruppata delle due sequenze.

Nota sull'utilizzo

In Visual Basic e C# è possibile chiamare questo metodo come metodo di istanza su qualsiasi oggetto di tipo IEnumerable<TOuter>. Per chiamare il metodo utilizzando la sintassi del metodo di istanza, omettere il primo parametro. Per ulteriori informazioni, vedere Metodi di estensione (Visual Basic) o Metodi di estensione (Guida per programmatori C#).

EccezioneCondizione
ArgumentNullException

outer o inner o outerKeySelector o innerKeySelector o resultSelector è null.

Questo metodo viene implementato tramite esecuzione posticipata. Il valore restituito immediato è un oggetto che contiene tutte le informazioni necessarie all'esecuzione dell'azione. La query rappresentata da questo metodo non viene eseguita finché l'oggetto non viene enumerato tramite chiamata diretta al relativo metodo GetEnumerator o utilizzando l'oggetto foreach in Visual C# oppure For Each in Visual Basic.

L'operatore di confronto uguaglianze predefinito Default viene utilizzato per la codifica hash e il confronto delle chiavi.

GroupJoin produce risultati gerarchici per cui gli elementi da outer vengono abbinati agli insiemi di elementi corrispondenti da inner. GroupJoin consente di ottenere risultati sulla base di un insieme intero di corrispondenze per ogni elemento di outer.

NotaNota

Se non ci sono elementi correlati in inner per un elemento specificato di outer, la sequenza di corrispondenze per tale elemento sarà vuota ma sarà comunque presente nei risultati.

La funzione resultSelector viene chiamata solo una volta per ogni elemento outer con una raccolta di tutti gli elementi inner che corrispondono all'elemento outer. Questo comportamento è diverso da quello del metodo Join, in cui la funzione del selettore di risultato viene richiamata su coppie che contengono un elemento da outer e un elemento da inner.

GroupJoin mantiene l'ordine degli elementi di outer e, per ogni elemento di outer, l'ordine degli elementi corrispondenti di inner.

GroupJoin non ha un equivalente diretto in termini di database relazionale tradizionale. Tuttavia, questo metodo implementa un superset di inner join e di left outer join. Entrambe queste operazioni possono essere scritte in termini di join raggruppato. Vedere Operazioni di join.

Nella sintassi di una espressione di query, una clausola join … into (Visual C#) o Group Join (Visual Basic) viene convertita in una chiamata di GroupJoin.

Nell'esempio di codice riportato di seguito viene illustrato come utilizzare GroupJoin<TOuter, TInner, TKey, TResult>(IEnumerable<TOuter>, IEnumerable<TInner>, Func<TOuter, TKey>, Func<TInner, TKey>, Func<TOuter, IEnumerable<TInner>, TResult>) per eseguire un join raggruppato sulle due sequenze.


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



.NET Framework

Supportato in: 4.5.2, 4.5.1, 4.5, 4, 3.5

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

.NET per applicazioni Windows Phone

Supportato in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft