Iterator = Generators??
长话短说,C# 2.0中的Iterator语法实际上就是取代自己写一个IEnumerator实现的麻烦,它的语法比较简明,大大提高了编码效率,示例如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
在Boo中,这种IEnumerator的功能是通过Generator来实现的,而且有三种Generator语法形式:
- Generator Expression
- Generator Method
- List Comprehension
其实这三种形式都差不多,下面我们来看个实际的例子。这里假设我们要创建一个Stack类,要为这个Stack提供遍历功能,以下依次展示C# 2.0以及Boo三种形式的Generator的实现示例:
C# 2.0
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
Generator Expression
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Generator Method
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
List Comprehension
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
其实这个语法很简单,不过Generator真正好用的地方在于它同时支持表达式与条件,比如我想取出所有增大后不大于100的元素,那么我可以这样写Generator:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
总的来说,Boo的Generator语法要比C#的灵活些,不过并不是能做什么C#做不到的事情或者很复杂的事情,这些简便的语法也是充分吸取了Python的优点。