Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Enumerable.SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>)

 

Data di pubblicazione: novembre 2016

Proietta ogni elemento di una sequenza a un IEnumerable<T> e semplifica le sequenze risultanti in un'unica sequenza.

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

public static IEnumerable<TResult> SelectMany<TSource, TResult>(
	this IEnumerable<TSource> source,
	Func<TSource, IEnumerable<TResult>> selector
)

Parametri

source
Type: System.Collections.Generic.IEnumerable<TSource>

Sequenza di valori da proiettare.

selector
Type: System.Func<TSource, IEnumerable<TResult>>

Funzione di trasformazione da applicare a ogni elemento.

Valore restituito

Type: System.Collections.Generic.IEnumerable<TResult>

Un IEnumerable<T> i cui elementi sono il risultato ottenuto richiamando la funzione di trasformazione uno-a-molti su ogni elemento della sequenza di input.

Parametri tipo

TSource

Tipo degli elementi di source.

TResult

Il tipo degli elementi della sequenza restituita da selector.

Exception Condition
ArgumentNullException

source o selector è null.

Questo metodo viene implementato tramite esecuzione posticipata. Il valore restituito immediato è un oggetto che archivia tutte le informazioni necessarie per eseguire l'azione. La query rappresentata da questo metodo non viene eseguita finché l'oggetto viene enumerata chiamando il relativo GetEnumerator metodo direttamente o tramite foreach in Visual C# o For Each in Visual Basic.

Il SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) metodo enumera la sequenza di input, utilizza una funzione di trasformazione per eseguire il mapping di ogni elemento di un IEnumerable<T>, e quindi enumera e restituisce gli elementi di ognuno di tali IEnumerable<T> oggetto. Ovvero, per ogni elemento della source, selector viene richiamato e viene restituita una sequenza di valori. SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) semplifica quindi questo insieme bidimensionale di raccolte in una matrice unidimensionale IEnumerable<T> e lo restituisce. Ad esempio, se una query utilizza SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) per ottenere gli ordini (di tipo Order) per ogni cliente in un database, il risultato è di tipo IEnumerable<Order> in c# o IEnumerable(Of Order) in Visual Basic. Se invece la query utilizza Select<TSource, TResult> per ottenere gli ordini, l'insieme di insiemi di ordini non è combinato e il risultato è di tipo IEnumerable<List<Order>> in c# o IEnumerable(Of List(Of Order)) in Visual Basic.

Nella sintassi delle espressioni di query, ogni from clausola (Visual C#) o From clausola (Visual Basic) dopo l'iniziale viene convertita in una chiamata di SelectMany<TSource, TResult>.

Esempio di codice seguente viene illustrato come utilizzare SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) per eseguire una proiezione di uno-a-molti su una matrice.

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

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

    // Query using SelectMany().
    IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);

    Console.WriteLine("Using SelectMany():");

    // Only one foreach loop is required to iterate 
    // through the results since it is a
    // one-dimensional collection.
    foreach (string pet in query1)
    {
        Console.WriteLine(pet);
    }

    // This code shows how to use Select() 
    // instead of SelectMany().
    IEnumerable<List<String>> query2 =
        petOwners.Select(petOwner => petOwner.Pets);

    Console.WriteLine("\nUsing Select():");

    // Notice that two foreach loops are required to 
    // iterate through the results
    // because the query returns a collection of arrays.
    foreach (List<String> petList in query2)
    {
        foreach (string pet in petList)
        {
            Console.WriteLine(pet);
        }
        Console.WriteLine();
    }
}

/*
 This code produces the following output:

 Using SelectMany():
 Scruffy
 Sam
 Walker
 Sugar
 Scratches
 Diesel

 Using Select():
 Scruffy
 Sam

 Walker
 Sugar

 Scratches
 Diesel
*/

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 3.5
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: