自.net 3.5起,MS在System.Linq命名空间下的Enumerable对象中提供了一组IEnumerable的扩展方法,从而极大的方便了我们的查询操作。尽管如此,由于IEnumerable用得实在太多,我们在实际的开发过程中往往还是会针对IEnumerable对象补充一些扩展函数。

可能是MS也发现了现有的扩展函数还不够用,官方自己有发布了一个扩展函数库Interactive Extensions(IX),我们可以通过NuGet来获取它。

Interactive Extensions的主体对象为EnumerableEx,它也是定义在名字空间System.Linq里面,而我们平时用的大多是其扩展函数,也就是说,并不需要通过的using导入额外的名字空间也能使用。

Enumerate序列对象创建

在Enumerate对象中,提供了三个序列对象创建函数:Range、Empty和Repeat。IX框架中又补充了好几个:Return、Throw、For、Generate、 Create、Defer、Using、Case、While和If。

  1. Return返回仅包含一个值的迭代,现在不用显式创建一个成员的数组了。
  2. Throw返回迭代时抛异常的序列,感觉主要用于测试。
  3. For的功能感觉和SelectMany基本相同,不知道为什么加这个函数
  4. Generate则是通过迭代的方式来进行创建序列
  5. CreateDefer则用于延迟创建对象,序列中元素是在迭代的时候通过工厂函数生成的。
  6. Using可以指定一个迭代过程中使用的资源对象,它在迭代开始的时候被创建,迭代结束后释放。
  7. Case可从一个序列Dictionary中根据指定的Key选择出序列,并支持key不存在是返回默认序列(感觉这个用途不大)。
  8. While根据条件将序列构建为循环序列,是DoWhile的非扩展版本。
  9. If根据条件在两组序列中选择一组返回,感觉用途不大。

异常处理:

在迭代过程中,如果出现异常则会终止迭代,并抛出异常。现在IX库增加了几种异常处理的扩展函数。

  • Retry:Retry函数可以在序列迭代过程中出错后重新迭代,直到完成迭代为止,可以指定重试的次数。
  • OnErrorResumeNext:OnErrorResumeNext函数和Concat类似,不同的时它是无视主序列迭代异常的,当主序列迭代异常时仍然能继续迭代下一个序列。
  • Catch: Catch函数和OnErrorResumeNext类似,不同的是它要指定异常处理函数来处理异常,当异常处理函数无法处理异常时,异常仍然会被抛出。
  • Finally:Finally函数则可以处理迭代结束后的收尾工作,无论是否发生异常该回调都能执行。

其它的扩展函数

IsEmpty:用来判断序列是否为空,这个扩展函数是非常常用的,不知道为什么最初没有把它放到BCL中。

Scan:Scan功能和聚合函数Aggregate类似,不过它的返回值是一个序列,也就是说它支持复合调用,如:num.Scan((acc, n) => acc + n).Scan((acc, n) => acc + 2 * n);。

Buffer: Buffer函数和提供了和系统的SelectMany函数相反的一个功能,用来缓存序列,如:Enumerable.Range(0, 10).Buffer(3); //[0,1,2] [3,4,5] [6,7,8] [9]

TakeLast和SkipLast:TakeLast和SkipLast则提供了Take和Skip函数的镜像功能。

Min和Max:Min和Max本身系统就提供,这里提供了一个可自定义comparer的版本

MinBy和MaxBy:MinBy和MaxBy则支持以对象中的某个成员作为比较的key,而无需以整个对象来比较。

Distinct:Distinct函数有了增强,可以指定对象的成员作为比较的key,更加实用。

DistinctUntilChanged:DistinctUntilChanged只在相邻的区间内做Distinct:它在RX框架中常用,但在IX框架下貌似用得很少。

ForEach:ForEach扩展函数虽然一直争议不断,但估计大部分程序员还是自己实现了这个扩展,这下有了官方的版本就免得自己写了。

Do:Do和ForEach的功能非常类似,不同的是它是延迟执行的,只有在对象被迭代的时候才会调用其回调函数。这个函数有好几种形式的扩展,还可以配置迭代完成和迭代异常的回调,非常好用。

Repeat:Repeat用于实现循环迭代,当迭代完成时,从头继续迭代。默认无限循环,也可以传入一个参数,指定循环次数。

DoWhile:DoWhile则是Repeat的条件版本,它可以传入一个Func<bool>的条件函数,当完成一轮迭代后,如果改条件函数返回true,则从头继续迭代。

Hide:

Enumerable.AsEnumerable函数可以实将一个实现了IEnumerable接口的对象转换为IEnumerable对象,从而隐藏对象的其它属性和方法。但AsEnumerable函数本身什么都没干,只是一个as转换,一次这种隐藏方式并不彻底,用户可以通过类型转换还原对象。

int[] numArray = new[] { 1, 2, 3 };
    IEnumerable<int> numSeq = numArray.AsEnumerable();
    int[] origArray = (int[])numArray;
    //这里没有异常

Hide函数则进行了对象转换,通过Hide函数隐藏的对象,无法通过类型转换还原为原始对象。

IEnumerable<int> numSeq = numArray.Hide();
    int[] origArray = (int[])numSeq;    //这里会抛异常

IgnoreElements:这个函数的作用是将序列转换为一个空序列,不知道在哪里可以用到它。

StartWith:和string的StartWith功能类似,用于匹配序列前缀。

Share:Share函数对已经迭代出的对象进行缓存,下一次再迭代的时候可以直接从缓存中取出,提高迭代性能。请注意如下代码使用和不使用share函数的区别。

var num = new
int[] { 1, 2, 3 }.Do(Console.WriteLine);
    var num2 = num.Share();
    num2.ToArray();
    num2.ToArray();

另外,IX还提供了两个函数Publish和Memoize,也实现了类似的功能,但我没找到这三个函数之间有啥区别,暂时还没有找到,等后续再补充。

后记:

我见到很多人习惯自己写扩展函数,甚至很多扩展函数都是系统中本身就是已经有的。虽然这个库并没有合入到BCL中,但MS官方的库无论从实用性、规范性和质量来讲都是一流的,并且IX和RX库都是开源的,还是非常值得学习的。

Interactive Extensions简介的更多相关文章

  1. ReactiveX 学习笔记(11)对 LINQ 的扩展

    Interactive Extensions(Ix) 本文的主题为对 Ix 库,对 LINQ 的扩展. Buffer Ix.NET Buffer Ix.NET BufferTest Buffer 方法 ...

  2. 中文翻译:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  3. MIME(Multipurpose Internet Mail Extensions)的简介

    多用途互联网邮件扩展类型(MIME) 作用:用于标识Web资源类型(Multipurpose Internet Mail Extensions,MIME) 效果:Web上MIME为每种类型的资源提供一 ...

  4. php命令行用法简介

    Php是一个非常流行的web服务端脚本语言.其实,php不仅仅可以在web服务器中充当重要角色.在命令行一样可以执行. 本文中,笔者为各位介绍下php在命令行中的使用方法. 1.  查看php的版本. ...

  5. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  6. (一)Spark简介-Java&Python版Spark

    Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...

  7. ASP.NET Core 1.1 Preview 1 简介(包含.NETCore 1.1升级公告)

    ASP.NET Core 1.1 Preview 1于2016年10月25日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强. 要将现有项目更新到ASP.NET Core 1.1 Pre ...

  8. ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...

  9. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

随机推荐

  1. C# 引用访问权限

    同样代码表现的不同行为 创建基类(Super)和派生类(Sub)每个类有一个字段field和一个公共方法getField,并且使用内联的方式初始化为1,方法getField返回字段field.C#和J ...

  2. 我对于js注入的理解

    资料:http://blog.csdn.net/gisredevelopment/article/details/41778671 js注入就是在前端利用使用js的地方 在这其中注入你写的js代码 使 ...

  3. load_file()与into outfile函数详解

    load_file()函数的使用: 1.使用条件 ①有读取文件的权限 r and (select count(*) from mysql.user)>0 如果返回正常则说明有权限,反之没有 ②文 ...

  4. Leetcode 594.最长和谐子序列

    最长和谐子序列 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1. 现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5 ...

  5. [oldboy-django][2深入django]浏览器同源策略 + JSONP + cros

    浏览器的同源策略: - 同源: 同方法,同域名,同端口 http://www.baidu.com:8000 http: 方法 www.baidu.com: 域名 8000: 端口 - 定义 网上解析非 ...

  6. SGX技术初探

    一.SGX技术背景 1.1 SGX技术定义 SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系(IA)的一个扩展,用于增强软件的安全性.这种方式并不是 ...

  7. [cocos2dx UI] CCLabelAtlas 为什么不显示最后一个字

    CClabelAtlas优点,基本用法等我就不说了,这里说一个和美术配合时的一个坑!就是图片的最后一位怎么也不显示,如下图中的冒号不会显示 查了ASCII码表,这个冒号的值为58,就是在9(57)的后 ...

  8. [Gym101982M][思维好题][凸壳]Mobilization

    [gym101982M][思维好题][凸壳]Mobilization 题目链接 20182019-acmicpc-pacific-northwest-regional-contest-div-1-en ...

  9. 城市改造 (city)

    城市改造 (city) 题目描述 为了节约当前社会巨大的能源消耗,A 城市发起了新能源改造计划,也就是用太阳能代替旧能源.为了简化题意,可以假设 A 城市在一个二维平面上,平面上从11到nn每一个地方 ...

  10. 分布式存储ceph集群实践

    1.环境规划,三台主机 10.213.14.51/24            10.213.14.52/24       10.213.14.53/24    集群网络 172.140.140.11. ...