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

 

Data di pubblicazione: ottobre 2016

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

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

Sequenza di valori da proiettare.

collectionSelector
Type: System.Func<TSource, IEnumerable<TCollection>>

Funzione di trasformazione da applicare a ogni elemento della sequenza di input.

resultSelector
Type: System.Func<TSource, TCollection, TResult>

Funzione di trasformazione da applicare a ogni elemento della sequenza intermedia.

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

Parametri tipo

TSource

Tipo degli elementi di source.

TCollection

Tipo degli elementi intermedi raccolti da collectionSelector.

TResult

Tipo degli elementi della sequenza risultante.

Exception Condition
ArgumentNullException

Il parametro source, il parametro collectionSelector o il parametro resultSelector è 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, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) metodo è utile quando è necessario mantenere gli elementi di source nell'ambito per la logica di 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 gli oggetti di tipo TSource e gli oggetti di tipo TCollection, vale a dire, se un oggetto di tipo TCollection fornisce una proprietà per recuperare il TSource oggetto che ha prodotto, non è necessario questo overload del metodo SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). In alternativa, è possibile utilizzare SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) e tornare al TSource tramite il TCollection oggetto.

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, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) per eseguire una proiezione di uno-a-molti su una matrice e utilizzare una funzione del selettore di risultato per mantenere ogni elemento corrispondente dalla sequenza di origine nell'ambito per la chiamata finale al 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}

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: