迭代器是方法、get访问器或运算符,使得开发人员能够在类或结构中支持foreach迭代,而不必实现整个IEnumerable接口。只需提供一个迭代器,即可遍历类中的数据结构。当编辑器检测到迭代器时,他将自动生成IEnumerable或IEnumerable接口的Current、MoveNext和Dispose方法。迭代器的特点:
迭代器可用方法、运算符或get访问器的代码体。
迭代器使用yield return语句一次返回每个元素,yield break 将终止迭代。
迭代器是可以返回相同类型的值的有序序列的一段代码
迭代器的返回类型必须是IEnumerable和IEnumerator中的任意一种。
例:创建迭代器
namespace JieKou
{
class StudentList
{
string student1 = "甲";
string student2 = "乙";
string student3 = "丙";
string student4 = "丁";
string student5 = "戊";
public String Student1 { get { return student1; } set { student1 = value; } }
public String Student2 { get { return student2; } set { student2 = value; } }
public String Student3 { get { return student3; } set { student3 = value; } }
public String Student4 { get { return student4; } set { student4 = value; } }
public String Student5{ get { return student5; } set { student5 = value; } }
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < 5; i++)
{
switch (i)
{
case 0:
yield return Student1;
break;
case 1:
yield return Student2;
break;
case 2:
yield return Student3;
break;
case 3:
yield return Student4;
break;
case 4:
yield return Student5;
break;
}
}
}
}
class Program
{
static void Main(string[] args)
{
StudentList myStudent = new StudentList();
foreach (var student in myStudent)
{
Console.WriteLine(student.ToString());
}
}
}
}
输出结果:
甲
乙
丙
丁
戊
可以看到程序中为StudentList类实现了一个迭代器,并且通过迭代器获得相应的字段值。类的这种结构是比较合理的。当既需要通过遍历的方法获得对象中的全部内容,又需要单个地获得其属性的时候应当使程序实现迭代器以及相应的属性。这样的代码便于使用。
例:迭代器通过IEnumerator接口实现GetEnumerator方法创建迭代器
string[] myFamily = { "父亲", "母亲", "弟弟", "妹妹" };
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < myFamily.Length; i++)
{
yield return myFamily[i];
}
}
例:使用迭代器显示公交站点
namespace ShowBusStation
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public static IList<object> items = new List<object>();//定义一个泛型对象,用于存储对象
/// <summary>
/// 通过迭代器获取泛型中的所有对象值
/// </summary>
/// <param Node="n">泛型对象</param>
/// <returns>IEnumerable<object></returns>
public static IEnumerable<object> GetValues()
{
if (items != null)//如果泛型不为空
{
foreach (object i in items)//遍历泛型中的对象
yield return i;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//向泛型集合中添加站点数据
items.Add("长新东路"); items.Add("同康路"); items.Add("农行干校"); items.Add("八里堡"); items.Add("东荣大路");items.Add("二木材");
items.Add("胶合板厂"); items.Add("阜丰路") items.Add("荣光路");
items.Add("东盛路");items.Add("安乐路");items.Add("岭东路");items.Add("公平路");items.Add(108); items.Add(true);
}
private void button1_Click(object sender, EventArgs e)
{
foreach (object i in GetValues())//遍历泛型集合
listView1.Items.Add(i.ToString());//在列表视图中显示公交车站点
}
private void button2_Click(object sender, EventArgs e)
{
Close();//关闭当前窗体
}
}
}
例:使用迭代器实现倒序遍历
namespace ReverseOrder
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 通过迭代器实现字符串的倒序
/// </summary>
/// <param string="n">进行倒序的字符串</param>
/// <returns>以对象的方式倒序返回单个字符</returns>
public static IEnumerable<object> Transpose(string n)
{
if (n.Length >0)//如果泛型不为空
{
for (int i = n.Length-1; i >= 0; i--)//从末尾开始遍历字符串
yield return (object)n[i];//返回数据集合
}
}
/// <summary>
/// 获取倒序后的字符串
/// </summary>
/// <param string="Str">进行倒序的字符串</param>
/// <returns>返回倒序后的字符串</returns>
public string GetValue(string Str)
{
if (Str.Length == 0)//判断字符串长度是否为0
return "";//返回空
string Tem_Str = "";//记录倒序之后的字符串
foreach (object i in Transpose(Str))//遍历迭代器
Tem_Str += i.ToString();//获取迭代器中的每个字符
return Tem_Str;//返回倒序之后的字符串
}
private void button1_Click(object sender, EventArgs e)
{
textBox2.Clear();
textBox2.Text = GetValue(textBox1.Text);
}
}
}