最初,枚举数定位在集合中第一个元素前。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。 http://msdn.microsoft.com/zh-cn/library/system.collections.ienumerator%28VS.80%29.aspx
迭代是一个非常重要的技术,在程序设计算法的优化过程中具有核心地位。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> 的简单的方法有着本质的区别,它只有在实际执行时才会去进行查询,而且随时可以提前结束查询,在内存使用上不会增长而只会保持线性。迭代器,是一个非常伟大的工具,一定要好好掌握。
http://msdn.microsoft.com/zh-cn/library/system.collections.ienumerator%28VS.80%29.aspx
直接调用MoveNext才会枚举下一项,并且迭代器内部才记住此位置,调用Reset()重置为开始位置http://msdn.microsoft.com/zh-cn/library/dscyy5s0.aspx
没看出有任何需要用枚举的必要
{
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> 的简单的方法有着本质的区别,它只有在实际执行时才会去进行查询,而且随时可以提前结束查询,在内存使用上不会增长而只会保持线性。迭代器,是一个非常伟大的工具,一定要好好掌握。