Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método Enumerable.SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>)

 

Publicado: octubre de 2016

Proyecta cada elemento de una secuencia en IEnumerable<T>, reduce las secuencias resultantes en una única secuencia e invoca una función del selector de resultados en cada elemento.

Espacio de nombres:   System.Linq
Ensamblado:  System.Core (en 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
)

Parámetros

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

Secuencia de valores que se va a proyectar.

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

Función de transformación para aplicar a cada elemento de la secuencia de entrada.

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

Función de transformación para aplicar a cada elemento de la secuencia intermedia.

Valor devuelto

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

Una IEnumerable<T> cuyos elementos son el resultado de invocar la función de transformación uno a varios collectionSelector en cada elemento de source y, a continuación, asignar cada uno de esos elementos de la secuencia y sus elementos de origen correspondientes a un elemento de resultado.

Parámetros de tipo

TSource

Tipo de los elementos de source.

TCollection

Tipo de los elementos intermedios recopilados por collectionSelector.

TResult

El tipo de los elementos de la secuencia resultante.

Exception Condition
ArgumentNullException

source o collectionSelector o resultSelector es null.

Este método se implementa mediante la ejecución diferida. El valor devuelto inmediato es un objeto que almacena toda la información necesaria para realizar la acción. La consulta representada por este método no se ejecuta hasta que se enumera el objeto llamando a su GetEnumerator método directamente o mediante foreach en Visual C# o For Each en Visual Basic.

El SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) método resulta útil cuando tiene que mantener los elementos de source en el ámbito de la lógica de consulta que se produce después de llamar a SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). Vea la sección Ejemplo para obtener un ejemplo de código. Si hay una relación bidireccional entre los objetos de tipo TSource y objetos de tipo TCollection, es decir, si un objeto de tipo TCollection proporciona una propiedad para recuperar la TSource objeto que lo generó, no necesita esta sobrecarga de SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>). En su lugar, puede utilizar SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) y volver a la TSource de objeto a través de la TCollection objeto.

En la sintaxis de expresión de consulta, cada from cláusula (Visual C#) o From cláusula (Visual Basic) después de la inicial uno se convierte en una invocación de SelectMany<TSource, TResult>.

En el ejemplo de código siguiente se muestra cómo utilizar SelectMany<TSource, TCollection, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TCollection>>, Func<TSource, TCollection, TResult>) para realizar una proyección uno a varios sobre una matriz y utilizar una función del selector de resultados para mantener cada elemento correspondiente de la secuencia de origen en el ámbito de la llamada final 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}

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 3.5
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: