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.SelectMany<TSource, TCollection, TResult> (IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>)

Proietta ogni elemento di una sequenza a un oggetto IEnumerable<T>, semplifica le sequenze risultanti in un’unica sequenza e richiama una funzione del selettore di risultato su ogni elemento al suo interno.

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

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
	this IEnumerable<TSource> source,
	Func<TSource, IEnumerable<TCollection>> collectionSelector,
	Func<TSource, TCollection, TResult> resultSelector
)

Parametri di tipo

TSource

Tipo degli elementi di source.

TCollection

Tipo degli elementi intermedi raccolti da collectionSelector.

TResult

Tipo degli elementi della sequenza risultante.

Parametri

source
Tipo: System.Collections.Generic.IEnumerable<TSource>
Sequenza di valori da proiettare.
collectionSelector
Tipo: System.Func<TSource, IEnumerable<TCollection>>
Funzione di trasformazione da applicare a ogni elemento della sequenza di input.
resultSelector
Tipo: System.Func<TSource, TCollection, TResult>
Funzione di trasformazione da applicare a ogni elemento della sequenza intermedia.

Valore restituito

Tipo: System.Collections.Generic.IEnumerable<TResult>
Oggetto IEnumerable<T> i cui elementi sono il risultato ottenuto richiamando la funzione di trasformazione uno a molti collectionSelector su ogni elemento di source ed eseguire quindi il mapping di ognuno degli elementi di tale sequenza e del corrispondente elemento di origine a un elemento di risultato.

Nota sull'utilizzo

In Visual Basic e C# è possibile chiamare questo metodo come metodo di istanza su qualsiasi oggetto di tipo IEnumerable<TSource>. 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

source o collectionSelector 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.

Il metodo SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) è utile quando è necessario mantenere gli elementi di source in ambito per la logica della query che si verifica dopo la chiamata a SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). Per un esempio di codice, vedere la sezione relativa agli esempi. Se esiste una relazione bidirezionale tra oggetti di tipo TSource e oggetti di tipo TCollection, cioè se un oggetto di tipo TCollection fornisce una proprietà per recuperare l'oggetto TSource che lo produce, non è necessario questo overload di SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). È invece possibile utilizzare SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) e ritornare all'oggetto TSource tramite l'oggetto TCollection.

Nella sintassi di una espressione di query, ogni clausola from (Visual C#) o From (Visual Basic) successiva alla prima, viene convertita in una chiamata di SelectMany.

Nell'esempio di codice riportato di seguito viene illustrato come utilizzare SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) per eseguire una proiezione uno a molti su una matrice e utilizzare una funzione del selettore di risultato per mantenere ogni elemento corrispondente dalla sequenza di origine in ambito per la chiamata finale a Select.


            class PetOwner
            {
                public string Name { get; set; }
                public List<string> Pets { get; set; }
            }

            public static void SelectManyEx3()
            {
                PetOwner[] petOwners =
                    { new PetOwner { Name="Higa", 
                          Pets = new List<string>{ "Scruffy", "Sam" } },
                      new PetOwner { Name="Ashkenazi", 
                          Pets = new List<string>{ "Walker", "Sugar" } },
                      new PetOwner { Name="Price", 
                          Pets = new List<string>{ "Scratches", "Diesel" } },
                      new PetOwner { Name="Hines", 
                          Pets = new List<string>{ "Dusty" } } };

                // Project the pet owner's name and the pet's name.
                var query =
                    petOwners
                    .SelectMany(petOwner => petOwner.Pets, (petOwner, petName) => new { petOwner, petName })
                    .Where(ownerAndPet => ownerAndPet.petName.StartsWith("S"))
                    .Select(ownerAndPet =>
                            new
                            {
                                Owner = ownerAndPet.petOwner.Name,
                                Pet = ownerAndPet.petName
                            }
                    );

                // Print the results.
                foreach (var obj in query)
                {
                    Console.WriteLine(obj);
                }
            }

            // This code produces the following output:
            //
            // {Owner=Higa, Pet=Scruffy}
            // {Owner=Higa, Pet=Sam}
            // {Owner=Ashkenazi, Pet=Sugar}
            // {Owner=Price, Pet=Scratches}



.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
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2014 Microsoft