C#链接方式

示例

许多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来利用延迟执行的优势,后者在幕后创建了Enumerable和Enumerator。LINQ中的链接过程本质上是为原始集合构建一个可枚举的(迭代器),该集合被推迟了,直到通过枚举该枚举而得以实现。

这使这些功能可以流畅地链接到Wiki,其中一个功能可以直接作用于另一个功能的结果。这种类型的代码可用于在单个语句中执行许多基于序列的操作。

例如,可以在单个语句中组合Select,Where并对OrderBy序列进行转换,过滤和排序。

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

var processed = someNumbers
        .Select(n => n * 2)   // 每个数字乘以2
        .Where(n => n != 6)   // 保留所有结果,除了6
        .OrderBy(n => n);     // 升序排列

输出:

2
4
8

.NET Fiddle上的实时演示

扩展和返回通用IEnumerable<T>类型的任何函数都可以在单个语句中用作链接子句。这种流利的编程风格非常强大,在创建自己的扩展方法时应予以考虑。