連結方法

許多 LINQ 函式都在 IEnumerable<TSource> 上執行,並且還返回 IEnumerable<TResult>。型別引數 TSourceTResult 可能會或可能不會引用相同的型別,具體取決於所討論的方法和傳遞給它的任何函式。

這方面的一些例子是

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
)

雖然某些方法連結可能需要在繼續之前處理整個集合,但 LINQ 通過使用 yield return MSDN 來利用延遲執行,該 MSDN 在後臺建立 Enumerable 和 Enumerator。在 LINQ 中連結的過程本質上是為原始集合構建一個可列舉(迭代器) - 這是延遲的 - 直到通過列舉列舉來實現****

這允許這些函式流暢地連結 wiki ,其中一個函式可以直接對另一個函式的結果起作用。這種程式碼風格可用於在單個語句中執行許多基於序列的操作。

例如,可以將 SelectWhereOrderBy 組合在一個語句中對序列進行轉換,過濾和排序。

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

輸出:

2
4
8

.NET 小提琴現場演示

擴充套件和返回泛型 IEnumerable<T> 型別的任何函式都可以在單個語句中用作連結子句。這種流暢的程式設計風格很強大,在建立自己的擴充套件方法時應該考慮到這一點。