说说IEnumerable和yield

IEnumerable数据类型是我比较喜欢的数据类型,特别是其强类型IEnumerable<T>更获得Linq的支持使得代码看起来更加优雅、整洁。

编写返回值为IEnumerable(或IEnumerabl<T>,下同)的方法时,会经常用到yield。近几天在开发时碰到一个很头疼的问题,终于在昨天解决。现将问题即解决过程记录如下:

一、问题的出现:

编写返回值为IEnumerable的方法时,可以用两种方式返回值:

1、构造一个实现IEnumerable接口的对象,并返回。

2、在方法体内使用yield return逐个返回可能的值,如果中途遇到不需要再返回值的情形,可以使用yield break;语句.

有一天突发奇想,能不能混合这两种方式:如果业务逻辑不允许返回值,则用yield break,否则构建一个实现IEnumerable接口的对象返回呢?

于是按如下思路编写代码:

写完后发现return语句总是报错:无法从迭代器返回值。请使用yield return语句返回值,或使用yield break语句结束迭代。

二、问题的解决:

仔细思考后,发现迭代器的原理大致如下:

如果方法按迭代方法执行,则完全以yield return语句来进行迭代。否则,返回一个IEnumerable对象,运行时会迭代该对象。

最终两种方法重写代码均获得通过。

方式一:纯迭代器方式

方式二:纯构造IEnumerable对象

三、思考

1、从代码的可读性和优雅性两个方面考虑,在允许的情况下应尽可能构造IEnumerable对象作为返回值,确有必要才用yield return语句。

2、语句内出现foreach时,请尽量借用强大的lamda表达式,而不是构造返回IEnumerable的方法或是使用foreach循环。

3、请尽量使用IEnumerable<T>而不是IEnumerable,以便获得强大的linq支持。

下面的方法将根据方法名和参数列表从一个方法列表中找到最合适的方法:

而采用lamda表达式将得到更优雅的表达:

寥寥两行代码,语义十分清晰,根本无须注释.

 
 
 
标签: lamda

最新文章

  1. JavaScript错误/异常处理
  2. 检测到有潜在危险的 Request.Form 值
  3. asp.net中用cookie记住密码上次不用登陆
  4. Js 类定义的几种方式
  5. 技术文档--volley 框架
  6. Bad apple for CSharp
  7. What&#39;s Exposure?
  8. Docker容器中运行ASP.NET Core
  9. Asp.net主题(theme)和皮肤(skin)的使用
  10. YUV422 YUV420 Planar \ Semi-Planar \ Interleaved
  11. 关于react-native遇到Can&#39;t find variable: TouchableHighlight
  12. span设置宽和高当没有内容的时候也可以撑开
  13. eclipse中maven工程的创建javaweb项目
  14. 【学习进步之路】-【浏览器兼容】透明背景图IE、360浏览器不兼容
  15. struts2中struts.xml配置文件详解
  16. python调用百度语音(语音识别-斗地主语音记牌器)
  17. linux 命令启动Oracle数据库
  18. Ex 2_34 线性3SAT..._第四次作业
  19. Eclipse 工作空间的相关说明
  20. PowerDesigner最基础的使用方法入门学习(二)

热门文章

  1. scala 101
  2. 杭州电acm理工大舞台版
  3. Nyoj 一笔画问题(图论)
  4. Babelfish (STL)
  5. (一)spring MVC基本概念和流程
  6. robot framework用python扩展编写自定义library
  7. 【百度地图API】如何制作商圈地图?行政地图?
  8. 浅谈 js 正则之 test 方法
  9. sgu139Help Needed!推断15数码是否有解,以及推断N数码是否有解的推论
  10. Web API 2:Action的返回类型