用于 LINQ to Objects 的交互扩展

  • Jonathan Allen
  • 高翌翔

2011 年 8 月 7 日

话题:.NET语言 & 开发架构

交互扩展(Interactive Extensions,缩写为 Ix)是一组附加的 LINQ to Objects 查询操作符,它建立在 Reactive Extensions(Rx)所完成工作的基础之上。快速浏览交互扩展的 API 之后,我们发现,在 System.Linq 命名空间下有一组 IEnumerable 的扩展方法。尽管大多数开发人员已经在他们自己的工具库中编写了许多此类扩展方法,但是拥有一份标准实现还是会弥补此处空白

  • 首先是 ForEach 扩展方法,几乎每个开发人员都曾或多或少编写过此方法。此方法有两个变体,其中第二个变体包括一个从零开始的索引。
  • Buffer 扩展方法将根据给定大小把一个枚举(enumeration)切分成若干个更小的枚举。此方法使用一种预先加载和延缓加载相混合的加载方式。它会预先读取每个拥有 N 个元素的缓冲区,但是在前一缓冲区中的元素被完全使用以前,都不会从源对象读取更多的元素。
  • Catch 扩展方法是个相当有趣的功能。在程序执行完毕或者是抛出异常以前,程序都将从一个源对象读取数据。对于后一种情况(程序抛出异常),程序将接着开始从第二源对象读取数据。第二源对象可能是 IEnumerable 实例或者是返回值为 IEnumerable 实例的函数。当使用后一种逻辑时,我们可以限制到某个特定类型的异常。
  • Defer 扩展方法会接受一个函数,而不是 IEnumerable 实例作为参数。当且仅当某些情况试图枚举时,该函数才会执行。
  • DistinctUntilChanged 扩展方法会过滤掉连续的重复值。例如,[A A B A A B] 序列将成为 [A B A B]。
  • Do 扩展方法是 ForEach 的一种变体,Do 方法的功能仅仅是当元素被枚举时针对每个元素执行其 action 委托方法。
  • DoWhile 扩展方法除了 predicate 委托方法不考虑被枚举项之外,和 TakeWhile 方法非常类似。
  • For 扩展方法处理一个有趣的问题。假设你有一份作者列表,以及一个能返回图书列表的匹配搜索函数。For 方法将针对列表中的每一位作者执行此搜索函数,并返回一份串联起来的图书列表。
  • Generate 扩展方法会返回一个列表,此方法将模仿 C 风格的 for 循环。此方法所需的参数包括,条件函数,用于改变状态的迭代函数,以及结果选择器。你可以将这种方式简单理解为用与 IEnumerable 一样的方式来表现状态机。
  • If 扩展方法使用一个断言(predicate)函数来确定返回两个列表中的一个。如果只提供了一个列表,那么对于此种错误情况将会返回一个空序列。
  • Memoize 扩展方法可以用于阻止对源对象多次枚举。在某些方面,Memoize 方法就和 ToList 方法类似,但是 ToList 对源对象至少可以枚举一次,而 Memoize 对源对象最多只能枚举一次。如果你告诉 Memoize 有多少预期读取程序,那么随着某些项被所有预期读取程序使用以后,此方法可以从内部缓冲区中移除这些项。
  • Min 和 Max 这两个扩展方法的工作方式正如方法名所宣称的一样。MinBy 和 MaxBy 这两个扩展方法增加了对于提供单值函数的选项,以便你可以表达“选择销售额最多的客户”等诸如此类的想法。
  • OnErrorResumeNext 扩展方法能够串接两个或更多序列以获得额外的好处,即当任一序列产生错误时将不会阻止继续串联剩余的序列。
  • Repeat 扩展方法会创建一个有限的或者无限的列表,此方法一遍又一遍地简单重复相同的值。这个值可以是标量或是列表。
  • Retry 扩展方法将试图枚举某个源对象,直到枚举成功或者抛出指定数量的异常。
  • Return 扩展方法将把一个标量值转换为一个仅包含该值的列表,再也无需显式创建长度为 1 的数组了。
  • Scan 扩展方法对于聚合多个字段很有用。不同于一般的聚合函数,Scan 方法可以复合调用,此方式大大减少了通过源对象的传递次数。例如,source.Scan(a=> Dollars +=a.Dollars).Scan(a=> Units +=a.Units)。
  • SkipLast 和 TakeLast 这两个扩展方法是 Take 和 Skip 两个方法的镜像。
  • Throw 扩展方法对于测试很有用,它会创建一个 IEnumerable 实例,当某人试图枚举该实例时,它就会抛出异常。

想要了解更多有关交互扩展(Ix)的信息,你可以观看 Bart De Smet 的演示下载实验版本

查看英文原文:Interactive Extensions for LINQ to Objects

相关阅读

.NET语言 & 开发架构