C# Language Metodi di concatenamento


Esempio

Molte funzioni LINQ funzionano entrambe su un oggetto IEnumerable<TSource> e restituiscono anche un IEnumerable<TResult> . I parametri di tipo TSource e TResult possono o meno riferirsi allo stesso tipo, a seconda del metodo in questione e delle eventuali funzioni passate ad esso.

Alcuni esempi di questo sono

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
)

Mentre alcuni metodi di concatenamento possono richiedere l' esecuzione di un intero set prima di andare avanti, LINQ sfrutta l' esecuzione differita usando MSDN return return che crea un Enumerable e un Enumerator dietro le quinte. Il processo di concatenamento in LINQ consiste essenzialmente nella costruzione di un enumerabile (iteratore) per il set originale - che viene rinviato - fino a quando non si materializza enumerando l'enumerabile .

Ciò consente a queste funzioni di essere fluentemente collegate a wiki , in cui una funzione può agire direttamente sul risultato di un'altra. Questo stile di codice può essere utilizzato per eseguire molte operazioni basate su sequenze in una singola istruzione.

Ad esempio, è possibile combinare Select , Where e OrderBy per trasformare, filtrare e ordinare una sequenza in una singola istruzione.

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

Produzione:

2
4
8

Live Demo su .NET Fiddle

Qualsiasi funzione che estenda e restituisca il tipo IEnumerable<T> generico può essere utilizzata come clausole concatenate in una singola istruzione. Questo stile di programmazione fluida è potente e dovrebbe essere preso in considerazione quando si creano i propri metodi di estensione .