以前一直不明白迭代器的使用,今天仔细看了一下某位大牛的博客文章,算是大概明白了,一个简单的例子如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 迭代器测试 { public partial class Form1 : Form { public Form1() { InitializeComponent(); item = Rtest(); //完成初始化 itemevery = item.GetEnumerator(); } IEnumerable <string> item; //迭代器 IEnumerator <string > itemevery; //遍历使用 private void button1_Click(object sender, EventArgs e) { if (itemevery.MoveNext() == false) //需要先move一次,才能获得第一个值 { MessageBox.Show("遍历完了"); } else button1.Text = itemevery.Current; //有效时才能获得值 } public IEnumerable<string> Rtest() //第一次返回a ,第二次返回b { MessageBox .Show("----我TestStateChange是第一行代码"); MessageBox.Show("----我是第一个yield return前的代码"); yield return "a"; //会执行以上代码 MessageBox.Show("----我是第一个yield return后的代码"); MessageBox.Show("----我是第二个yield return前的代码"); yield return "b"; //会执行以上代码 //以下代码依然会得到执行,但是MoveNext返回false MessageBox.Show("----我是第二个yield return前的代码"); } } }
如果希望持续循环的获得数据,那么你可能会尝试itemevery.Reset();但是其实会报错的,原理可能比较复杂,没有真正实现Reset()方法
你可以用重新获得状态来实现:
if (itemevery.MoveNext() == false) { //MessageBox.Show("遍历完了"); itemevery = item.GetEnumerator(); //获得新的 } else button1.Text = itemevery.Current;
这样就可以无限循环下去了!