C# Language Métodos de encadenamiento


Ejemplo

Muchas funciones de LINQ operan en un IEnumerable<TSource> y también devuelven en IEnumerable<TResult> . Los parámetros de tipo TSource y TResult pueden o no referirse al mismo tipo, según el método en cuestión y las funciones que se le pasen.

Algunos ejemplos de esto son

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

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, int, bool> predicate
)

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

Mientras que algunos métodos de encadenamiento pueden requerir que se trabaje un conjunto completo antes de continuar, LINQ aprovecha la ejecución diferida utilizando el rendimiento MSDN que crea un Enumerable y un Enumerador detrás de la escena. El proceso de encadenamiento en LINQ consiste esencialmente en construir un enumerable (iterador) para el conjunto original, que se difiere, hasta que se materialice al enumerar el enumerable .

Esto permite que estas funciones se encadenen con fluidez en el wiki , donde una función puede actuar directamente sobre el resultado de otra. Este estilo de código se puede usar para realizar muchas operaciones basadas en secuencias en una sola declaración.

Por ejemplo, es posible combinar Select , Where y OrderBy para transformar, filtrar y ordenar una secuencia en una sola declaración.

var someNumbers = { 4, 3, 2, 1 };

var processed = someNumbers
        .Select(n => n * 2)   // Multiply each number by 2
        .Where(n => n != 6)   // Keep all the results, except for 6
        .OrderBy(n => n);     // Sort in ascending order

Salida:

2
4
8

Demo en vivo en .NET Fiddle

Cualquier función que extienda y devuelva el tipo genérico IEnumerable<T> se puede usar como cláusulas encadenadas en una sola declaración. Este estilo de programación fluida es potente, y debe tenerse en cuenta al crear sus propios métodos de extensión .