連結方法
許多 LINQ 函式都在 IEnumerable<TSource>
上執行,並且還返回 IEnumerable<TResult>
。型別引數 TSource
和 TResult
可能會或可能不會引用相同的型別,具體取決於所討論的方法和傳遞給它的任何函式。
這方面的一些例子是
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 ,其中一個函式可以直接對另一個函式的結果起作用。這種程式碼風格可用於在單個語句中執行許多基於序列的操作。
例如,可以將 Select
,Where
和 OrderBy
組合在一個語句中對序列進行轉換,過濾和排序。
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
擴充套件和返回泛型 IEnumerable<T>
型別的任何函式都可以在單個語句中用作連結子句。這種流暢的程式設計風格很強大,在建立自己的擴充套件方法時應該考慮到這一點。