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通过使用yieldreturnMSDN来利用延迟执行的优势,后者在幕后创建了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
.NETFiddle上的实时演示
扩展和返回通用IEnumerable<T>类型的任何函数都可以在单个语句中用作链接子句。这种流利的编程风格非常强大,在创建自己的扩展方法时应予以考虑。