迭代器的使用方法

以前一直不明白迭代器的使用,今天仔细看了一下某位大牛的博客文章,算是大概明白了,一个简单的例子如下:

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;

这样就可以无限循环下去了!

posted on 2015-04-24 13:27  飞翔蚂蚁  阅读(222)  评论(0编辑  收藏  举报

导航