用于LINQ to Objects的交互扩展

交互扩展(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

This entry was posted in 未分类. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s