博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
说说IEnumerable和yield
阅读量:7113 次
发布时间:2019-06-28

本文共 942 字,大约阅读时间需要 3 分钟。

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表达式将得到更优雅的表达:

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

转载于:https://www.cnblogs.com/lvwuhuijun/p/3501862.html

你可能感兴趣的文章
github fork别人项目之后,更新和提交操作
查看>>
springboot 集成 swagger2 小记
查看>>
gorose orm+dotweb框架快速构建go web网站实战(一)
查看>>
npm-发布&管理module
查看>>
JavaScript设计模式
查看>>
【Change Detection系列一】$digest 在Angular新版本中重生
查看>>
滚动相关知识点总结
查看>>
《Javascript高级程序设计 (第三版)》第三章 基本概念
查看>>
RhykeJS——专为开启“实验室功能”的手势密码库
查看>>
vue组件学习-数据传递-路由(初学者文档二)
查看>>
用ES6语法来开发angularjs项目,webpack进行按需加载模块打包
查看>>
可编程定时 / 计数器应用实验
查看>>
spring mvc中的几类拦截器对比
查看>>
Spring Security 使用总结
查看>>
Java验证
查看>>
一道CSS笔试题
查看>>
慕课网_《模式的秘密之单例模式》学习总结
查看>>
Struts2开发入门指南
查看>>
Ajax实现原理
查看>>
《深入理解ES6》笔记——解构:使数据访问更便捷(5)
查看>>