关于枚举的C#代码不是很理解,求解答。

问题描述

前面看到一个代码示例,但是不是很理解。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>的简单的方法有着本质的区别,它只有在实际执行时才会去进行查询,而且随时可以提前结束查询,在内存使用上不会增长而只会保持线性。迭代器,是一个非常伟大的工具,一定要好好掌握。
解决方案九:
大牛们都说了,我就不说什么了。。。

时间: 2024-09-20 11:57:19

关于枚举的C#代码不是很理解,求解答。的相关文章

c++-C++代码有什么问题啊 求解答

问题描述 C++代码有什么问题啊 求解答 为什么编译器提示 Line3: error: expected unqualified-id before ';' token 解决方案 templete是用来修饰函数的,它后面不要分号. 你也可以写在一行 templete <typename T> T max(T a, T b) { } 不知道为什么大家都喜欢写2行,是不是都是受谭浩强的误导. 解决方案二: template模版定义后面不需要引号,你去掉就可以了 解决方案三: max前面是不是少了&

代码- c# 重绘问题 求解答 doc.drawobjectlist 怎么获取

问题描述 c# 重绘问题 求解答 doc.drawobjectlist 怎么获取 由于刚学习c#,窗口全屏的时候,控件自适应移动位置,在移动的时候出现严重闪烁,自己查了一下,用双缓冲效果不大,所以用重绘,但是代码完全看不懂...求解答,doc.drawobjectlist是从哪里获取的? Rectangle rect = e.ClipRectangle; Bitmap bufferimage = new Bitmap(this.Width, this.Height); Graphics g =

代码-报错:ORA-12505 求解答

问题描述 报错:ORA-12505 求解答 报错:java.sql.SQLException: Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor (有两个类,一个是登录类,一个是登录的处理类) 主要代码:(登录类) protected void doGet(HttpS

swing-一段代码,调试很久没调试出来,求帮忙,哪里出了问题

问题描述 一段代码,调试很久没调试出来,求帮忙,哪里出了问题 一段代码,调试很久没调试出来,求帮忙,哪里出了问题,代码贴在下面 解决方案 import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Resul

关于JAVA的Comparable类不是很理解,写了一个有关比较的代码,但出现了异常,大神帮我看看

问题描述 关于JAVA的Comparable类不是很理解,写了一个有关比较的代码,但出现了异常,大神帮我看看 关于JAVA的Comparable类,我不是很理解,于是,我写了一个有关比较的代码,但出现了异常,大神帮我看看 解决方案 需要实现Comparable接口 Comparable implements Comparable 解决方案二: 首先,Java的array的sort方法要求传入的集合元素必须实现Comparable或者Comparator接口,其次,主要就是提供compareTo方

jsp页面框架-关于web前端兼容性问题,代码很简单,求解答

问题描述 关于web前端兼容性问题,代码很简单,求解答 无标题页 function move() { alert("hello world!"); } 在IE下不响应onclick 在火狐下可以 求改正 解决方案 你贴个function有什么用,要贴贴你调用这个function的地方啊 如果是IE10的话你需要下载.net formwork4.0控件适配器放在工程下的App_Browsers文件夹(如果没有这个文件夹就新建一个) 解决方案二: 单纯这个js方法,在任何浏览器下都能被执行

mvc-关于MVC中cshtml的一个问题,代码不是很懂,希望来个懂得给我详解一下@

问题描述 关于MVC中cshtml的一个问题,代码不是很懂,希望来个懂得给我详解一下@ $('div.choose-tab dl#cata dd a').click(function () { getBrandByCata($(this).attr("catavalue"), 0); $(this).addClass("current"); $('input#catagoryId').val($(this).attr("catavalue"));

Delphi 枚举设备使用代码

delphi 枚举设备使用代码 现在的 delphi(2010.xe) 已经自带了 directx 的相关单元(...sourcertlwin). -------------------------------------------------------------------------------- //枚举函数 function directsoundenumerate(   lpdsenumcallback: tdsenumcallback; //回调函数   lpcontext:

biginteger-Java中n!的代码看不懂啊,求解释

问题描述 Java中n!的代码看不懂啊,求解释 import java.math.BigInteger; import java.util.*; public class Main{ protected static ArrayList table = new ArrayList(); static { table.add(BigInteger.valueOf(1)); } public static synchronized BigInteger factorial(int x) { for