问题描述
前面看到一个代码示例,但是不是很理解。GameMoves.cs代码usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Collections;namespaceWrox.ProCSharp.Arrays{publicclassGameMoves{privateIEnumeratorcross;privateIEnumeratorcircle;publicGameMoves(){cross=Cross();circle=Circle();}privateintmove=0;publicIEnumeratorCross(){while(true){Console.WriteLine("Cross,move{0}",move);move++;if(move>8)yieldbreak;yieldreturncircle;}}publicIEnumeratorCircle(){while(true){Console.WriteLine("Circle,move{0}",move);move++;if(move>8)yieldbreak;yieldreturncross;}}}}
主函数代码usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Collections;namespaceWrox.ProCSharp.Arrays{classProgram{staticvoidMain(){GameMovesg=newGameMoves();Console.WriteLine("11111");IEnumeratorenumerator=g.Cross();Console.WriteLine("22222");while(enumerator.MoveNext()){Console.WriteLine("33333");enumerator=(IEnumerator)enumerator.Current;}}}}
输出结果为:1111122222Cross,move033333Cross,move133333Circle,move233333Cross,move333333Circle,move433333Cross,move533333Circle,move633333Cross,move733333Circle,move833333说明Console.WriteLine("Cross,move{0}",move)语句是在enumerator.MoveNext()语句中执行的。但是GameMovesg=newGameMoves();以及IEnumeratorenumerator=g.Cross();不是都会调用GameMoves类中的Cross()函数么。他们之前的调用都不输出Console.WriteLine("Cross,move{0}",move)语句的?
解决方案
本帖最后由 MercuryGG 于 2013-05-31 15:44:26 编辑
解决方案二:
求大家指点。
解决方案三:
今天看到这段代码也不是很理解。求大神指点
解决方案四:
最初,枚举数定位在集合中第一个元素前。在此位置,调用Current属性会引发异常。因此,在读取Current的值之前,必须调用MoveNext方法将枚举数提前到集合的第一个元素。http://msdn.microsoft.com/zh-cn/library/system.collections.ienumerator%28VS.80%29.aspx
解决方案五:
g.Cross()只是初始化了一个迭代器直接调用MoveNext才会枚举下一项,并且迭代器内部才记住此位置,调用Reset()重置为开始位置
解决方案六:
还真不太用枚举
解决方案七:
MS都是C++程序员遗留下来的习惯没看出有任何需要用枚举的必要
解决方案八:
迭代是一个非常重要的技术,在程序设计算法的优化过程中具有核心地位。你贴出的代码,是迭代器的最原始的写法。实际上不需要这样创建迭代器方法。比如说写一个简单的例子,搜索某个“树”上的所有结点,可以写staticpublicIEnumerable<TreeNode>GetAllNodes(thisTreeNodeCollectionns){foreach(TreeNodeninns){yieldreturnn;foreach(TreeNodexinn.ChildNodes)yieldreturnx;}}
然后我们要查找某个值,可以写varresult=(fromninthis.TreeView1.Nodes.GetAllNodes()wheren.Value=="12345"selectn).First();
迭代器方法GetAllNodes跟返回一个List<TreeNode>的简单的方法有着本质的区别,它只有在实际执行时才会去进行查询,而且随时可以提前结束查询,在内存使用上不会增长而只会保持线性。迭代器,是一个非常伟大的工具,一定要好好掌握。
解决方案九:
大牛们都说了,我就不说什么了。。。