我们先思考几个问题为什么在foreach中不能修改item的值要实现foreach需要满足什么条件为什么Linq to Object中要返回IEnumerable?接下来先开始我们的正文。自己实现迭代器.net中迭代器是通过IEnumerable和IEnumerator接口来实现的今天我们也来依葫芦画瓢。首先来看看这两个接口的定义并没有想象的那么复杂。其中IEnumerable只有一个返回IEnumerator的GetEnumerator方法。而IEnumerator中有两个方法加一个属性。接下来开发画瓢我们继承IEnumerable接口并实现下面使用原始的方式调用有朋友开始说了我们平时都是通过foreache来取值的没有这样使用过啊。好吧我们来使用foreach循环为什么说基本上是等效的呢我们先看打印结果在看反编译代码。由此可见两者有这么个关系我们可以回答第一个问题了“为什么在foreach中不能修改item的值”我们还记得IEnumerator的定义吗接口的定义就只有get没有set。所以我们在foreach中不能修改item的值。我们再来回答第二个问题“要实现foreach需要满足什么条件”必须实现IEnumerable接口NO我们自己写的MyIEnumerable删掉后面的IEnumerable接口一样可以foreach不信自己去测试。所以要可以foreach只需要对象定义了GetEnumerator无参方法并且返回值是IEnumerator或其对应的泛型。细看下图也就是说只要可以满足这三步调用即可。不一定要继承于IEnumerable。有意思吧下次面试官问你的时候一定要争个死去活来啊哈哈yield的使用你肯定发现了我们自己去实现IEnumerator接口还是有些许麻烦并且上面的代码肯定是不够健壮。对的.net给我们提供了更好的方式。你会发现我们连MyIEnumerator都没要了也可以正常运行。太神奇了。yield到底为我们做了什么呢好家伙我们之前写的那一大坨。你一个yield关键字就搞定了。最妙的是这块代码