说说IEnumerable和yield

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

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

1、问题的出现:blog

编写返回值为IEnumerable的方法时,能够用两种方式返回值:接口

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

二、在方法体内使用yield return逐个返回可能的值,若是中途遇到不须要再返回值的情形,可使用yield break;语句.原理

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

因而按以下思路编写代码:循环

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

2、问题的解决:数据类型

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

若是方法按迭代方法执行,则彻底以yield return语句来进行迭代。不然,返回一个IEnumerable对象,运行时会迭代该对象。

最终两种方法重写代码均得到经过。

方式一:纯迭代器方式

方式二:纯构造IEnumerable对象

3、思考

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

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

三、请尽可能使用IEnumerable<T>而不是IEnumerable,以便得到强大的linq支持。

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

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

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

相关文章
相关标签/搜索