C#—内建接口: IEnumerable与IEnumerator接口详解
IEnumerable接口
在C#中,IEnumerable 是一个泛型接口,它表示一个可以通过 IEnumerator 迭代器进行迭代枚举的集合。这个接口是非常基础且重要的,因为它允许开发者以一致的方式遍历任何实现了该接口的集合,无论是数组、列表、自定义集合还是LINQ查询的结果。
IEnumerable是可迭代类型,只要一个类型实现了IEnumerable接口 那么就可以对它进行遍历。
实现IEnumerable接口
yield关键字 : 迭代器(相当于实现了IEnumerator枚举器)
在遍历Student对象时通过类中GetEnumerator方法向外部返回元素。
// 实现
class Student:System.Collections.IEnumerable
{
public int Id { get; set; }
public IEnumerator GetEnumerator()
{
yield return "学生1";
yield return "学生2";
yield return "学生3";
}
}
// 使用
public class IEnumerableShow
{
public void Show()
{
Student student = new Student();
foreach (var item in student) // 进行迭代
{
Console.WriteLine(item);
}
// 第一次打印学生1,第二次打印学生2,第三次打印学生3。
}
}
IEnumerator接口
IEnumerator 是一个用于迭代集合对象(如列表和数组)的接口。它提供了用于访问对象集合的元素的方法。
IEnumerable和IEnumerator接口搭配使用:
在遍历Student对象时通过Student类中GetEnumerator方法,对StudentEnumerator类进行实例,并触发遍历。
// 第一步:实现IEnumerable接口
class Student:System.Collections.IEnumerable
{
public int Id { get; set; }
public IEnumerator GetEnumerator()
{
string[] student = { "学生1" , "学生2", "学生3"};
return new StudentEnumerator(student); // 实例StudentEnumerator类,并通过构造向类中数组赋值
}
}
// 第二步: 实现 IEnumerator接口
internal class StudentEnumerator : IEnumerator
{
private string[] _student;
int _position = -1;
public StudentEnumerator(string[] student)
{
this._student = student;
}
public object Current // 获取集合中位于当前枚举的元素
{
get
{
if (_position == -1 || _position >= _student.Length)
{
throw new InvalidOperationException();
}
return _student[_position];
}
}
public bool MoveNext() // 把操作推进到下一个
{
if ( _position < _student.Length-1)
{
_position++;
return true;
}
return false;
}
public void Reset() // 将枚举数设为初始数据
{
_position = -1;
}
}
// 第三步: 使用
public class IEnumerableShow
{
public void Show()
{
int[] array = { 1, 2, 3, 4, 5, };
Student student = new Student() { Id = 1 };
foreach (var item in student)
{
Console.WriteLine(item);
}
}
}