版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mango_love/article/details/84935723
说起迭代器我们对它的印象大概就是能够使用foreach关键字来遍历一个集合,还必须实现IEnumerable或IEnumerable<T>接口,实现里面的GetEnumerator方法。那么具体是怎样的呢?
其实迭代器跟数据库的游标非常相似,读取方式就是一直往下读,直到读完为止。下面我们来介绍C#是如何实现这个迭代器的步骤:
首先,我们要找到这个对象
然后,打开这个迭代器(GetEnumerator)
找到这个对象的第一条对象(Current),和这个开始对象的位置
接着一直往下读(MoveNext),直到读完这个索引器
最后释放这个迭代器(Dispose())
代码实现:
首先定义这个对象
public class Student
{
public string Name { get; set; }
public Student(string name)
{
this.Name = name;
}
}
定义这个构造器,实现MoveNext(),Current,Reset()属性和方法。
/// <summary>
/// 自定义一个迭代器
/// </summary>
public class StudentEnumerator : IEnumerator
{
private int index;
private Student current;
private StudentList studentList;
public StudentEnumerator(StudentList studentList)
{
//注入
this.studentList = studentList;
index = 0;
}
public object Current => this.current;
public bool MoveNext()
{
if (index+1>studentList.Count)
{
return false;
}
else
{
this.current = studentList[index];
index++;
return true;
}
}
public void Reset()
{
index = 0;
}
}
然后我们实现这个IEnumerable接口
public class StudentList : IEnumerable
{
private Student[] students;
public StudentList(Student[] student)
{
//构造注入
this.students = student;
}
//索引器
public Student this[int index]
{
get { return students[index]; }
}
//长度
public int Count { get { return students.Length; } }
//实现GetEnumerator方法,返回迭代器IEnumerator
public IEnumerator GetEnumerator()
{
return new StudentEnumerator(this);
}
}
最后我们调用它
static void Main(string[] args)
{
Student[] student ={
new Student("张三"),
new Student("李四"),
new Student("王麻子")
};
StudentList studentList = new StudentList(student);
foreach (Student s in studentList)
{
Console.WriteLine("当前学生姓名:{0}", s.Name);
}
Console.Read();
}
输出:
当前学生姓名:张三
当前学生姓名:李四
当前学生姓名:王麻子
在C#2.0中微软用yield来简化了迭代器的写法,开发人员只需要在实现GetEnumerator方法的时候用yield return就可以实现这个方法,所以yield就是一个语法糖,c#有非常多的语法糖
//实现GetEnumerator方法,返回迭代器IEnumerator
public IEnumerator GetEnumerator()
{
//return new StudentEnumerator(this);
for (int index = 0; index < students.Length; index++)
{
yield return students[index];
}
}
那么现在我们来分解foreach (Student s in studentList),
studentList调用GetEnumerator()方法,in 调用了MoveNext()方法,Student就是这个迭代的对象Current