本帖最后由 MercuryGG 于 2013-05-31 15:44:26 编辑

解决方案 »

  1.   

    最初,枚举数定位在集合中第一个元素前。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。
    http://msdn.microsoft.com/zh-cn/library/system.collections.ienumerator%28VS.80%29.aspx
      

  2.   

    g.Cross()只是初始化了一个迭代器
    直接调用MoveNext才会枚举下一项,并且迭代器内部才记住此位置,调用Reset()重置为开始位置http://msdn.microsoft.com/zh-cn/library/dscyy5s0.aspx
      

  3.   

    MS都是C++程序员遗留下来的习惯
    没看出有任何需要用枚举的必要
      

  4.   

    迭代是一个非常重要的技术,在程序设计算法的优化过程中具有核心地位。http://bbs.csdn.net/topics/360063963你贴出的代码,是迭代器的最原始的写法。实际上不需要这样创建迭代器方法。比如说写一个简单的例子,搜索某个“树”上的所有结点,可以写    static public IEnumerable<TreeNode> GetAllNodes(this TreeNodeCollection ns)
        {
            foreach (TreeNode n in ns)
            {
                yield return n;
                foreach (TreeNode x in n.ChildNodes)
                    yield return x;
            }
        }
    然后我们要查找某个值,可以写var result = (from n in this.TreeView1.Nodes.GetAllNodes()
                  where n.Value == "12345"
                  select n).First();
    迭代器方法 GetAllNodes 跟返回一个 List<TreeNode> 的简单的方法有着本质的区别,它只有在实际执行时才会去进行查询,而且随时可以提前结束查询,在内存使用上不会增长而只会保持线性。迭代器,是一个非常伟大的工具,一定要好好掌握。