说说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

Enumerable和yield的更多相关文章

  1. 集合 Enumerable Enumerator yield

    集合: 通过索引来访问成员,--引申到索引器 的使用 for foreach循环遍历 --引申到 IEnumerable IEnumerator(会引申到yield) 常用的集合操作,add, ins ...

  2. C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效(二)

    前言 在上篇文章中我得出结论,遍历迭代器修改迭代器中项目的值未生效,是因为使用了yield return,并且每次遍历迭代器都执行返回迭代器的方法.这篇文章是接着上篇文章,从代码实现的角度来验证出现这 ...

  3. C#中的using和yield return混合使用

    最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IEnumerable<T>了.我的代码里还有 ...

  4. C#高级功能(二)LINQ 和Enumerable类

    介绍LINQ之前先介绍一下枚举器 Iterator:枚举器如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.我们将以创建一个简单化的 ...

  5. C# 基础小知识之yield 关键字 语法糖

    原文地址:http://www.cnblogs.com/santian/p/4389675.html 对于yield关键字我们首先看一下msdn的解释: 如果你在语句中使用 yield 关键字,则意味 ...

  6. C# 使用IENUMERABLE,YIELD

    C# 使用IENUMERABLE,YIELD 前言 在上篇文章中我得出结论,遍历迭代器修改迭代器中项目的值未生效,是因为使用了yield return,并且每次遍历迭代器都执行返回迭代器的方法.这篇文 ...

  7. using和yield return

    C#中的using和yield return混合使用 最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IE ...

  8. HeadFirst Ruby 第十章总结 Comparable & Enumerable

    导言 这一章的标题是 Ready-Made Mixes, 也就是 Ruby 已经准备好的用于 Mix-in 的 Modules, 它们是: Comparable 和 Enumerable, Compa ...

  9. python yield yield from

    1.可迭代对象 具备可迭代的能力,即enumerable,在python中指的是可以通过for-in去逐个访问元素的一些对象,比如元组tuple,列表list,字符串string,文件对象file等. ...

随机推荐

  1. Robot Framework自动化测试(一)---第一个脚本(转)

    最近工具中用Robot Framework框架来做自动化,所以,花时间学习了一下. =======所需环境=================== Python: https://www.python. ...

  2. java_Eclipse中SVN的安装步骤(两种)和使用方法

    若是只要site地址: http://subclipse.tigris.org/update_1.6.x,  下边可以忽略 一.给Eclipse安装SVN,最常见的有两种方式:手动方式和使用安装向导方 ...

  3. EF中的贪婪加载和延迟加载(懒加载)

    在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的开销是很到的,尤其是在循环中,如果数据量不是很多的情况下还可以接受,如果数 ...

  4. 【百度地图API】百度API卫星图使用方法和卫星图对比工具

    原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...

  5. Java数据结构与算法(4) - ch04队列(Queue和PriorityQ)

    队列: 先进先出(FIFO). 优先级队列: 在优先级队列中,数据项按照关键字的值有序,关键字最小的数据项总在对头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序,从后往前将小于插入项的数 ...

  6. MyReport报表引擎2.7.6.7新功能

    新增二维码控件PDF417 设计器新增数据选项卡,可以拖放字段进行绑定   相关链接 MyReport演示.产品站点 相关文章 MyReport专栏

  7. 移动客户端与服务端Session那点秘密

    众所周知,做过Web开发的小伙伴可能知道,在浏览器向服务器发一个请求,服务器端会为当前的访问者创建一个session会话,随着浏览器的关闭而会话结束.但是移动客户端咋整呢(IOS/Android啥的) ...

  8. Python系列教程大汇总

    Python初级教程 Python快速教程 (手册) Python基础01 Hello World! Python基础02 基本数据类型 Python基础03 序列 Python基础04 运算 Pyt ...

  9. CSS下背景属性background的使用方法

    背景颜色(background-color) CSS可以用纯色来作为背景,也可以将背景设置为透明,background相当于xhtml中的bgcolor. 它的两个值: transparent(默认值 ...

  10. Cf 444C DZY Loves Colors(段树)

    DZY loves colors, and he enjoys painting. On a colorful day, DZY gets a colorful ribbon, which consi ...