C# Language Méthodes de chaînage


Exemple

De nombreuses fonctions LINQ opèrent toutes deux sur un IEnumerable<TSource> et renvoient également un IEnumerable<TResult> . Les paramètres de type TSource et TResult peuvent ou non se référer au même type, selon la méthode en question et les fonctions qui lui sont transmises.

Quelques exemples de ceci sont

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
)

Alors que certains chaînages de méthodes peuvent nécessiter l'utilisation d'un ensemble complet avant de passer à un autre, LINQ tire parti de l' exécution différée en utilisant MSDN de rendement qui crée un Enumerable et un Enumerator en arrière-plan. Le processus de chaînage dans LINQ consiste essentiellement à créer un enumerable (itérateur) pour l’ensemble original - qui est différé - jusqu’à ce qu’il soit matérialisé en énumérant l’énumérable .

Cela permet à ces fonctions d'être couramment enchaînées sur wiki , où une fonction peut agir directement sur le résultat d'une autre. Ce style de code peut être utilisé pour effectuer de nombreuses opérations basées sur des séquences dans une seule instruction.

Par exemple, il est possible de combiner Select , Where et OrderBy pour transformer, filtrer et trier une séquence en une seule instruction.

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

Sortie:

2
4
8

Démo en direct sur .NET Fiddle

Toutes les fonctions qui étendent et retournent le type générique IEnumerable<T> peuvent être utilisées comme clauses chaînées dans une seule instruction. Ce style de programmation fluide est puissant et doit être pris en compte lors de la création de vos propres méthodes d'extension .