目录
概念解析
迭代器定义:一种特殊的对象,它可以用来遍历集合中的元素,并且可以按顺序访问集合中的每个元素
迭代器对象:指实现了<IEnumerator>接口的类
可迭代对象:指实现了 IEnumerable 接口的对象,它可以使用 foreach 语句进行迭代,通常返回迭代器
结构解析
//可迭代对象接口
public interface IEnumerable
{
//用于返回迭代器
IEnumerator GetEnumerator();
}
//迭代器接口
public interface IEnumerator
{
//用于推进数据索引
bool MoveNext();
//用于获取当前索引的数据
object Curret();
//用于重置数据索引
void Reset();
}
实战速通
//----------------------------------------第一阶段--------------------------------------
//定一个人类(?
public class Person
{
//ID编号
public int Id;
//名字
public string Name;
//年龄
public int Age;
//构造函数初始化数据
public Person(int _Id,string _Name,int _Age)
{
this.Id = _Id;
this.Name = _Name;
this.Age = _Age;
}
}
//----------------------------------------第二阶段--------------------------------------
//使Person类实现IEnumerable接口
public class Person: IEnumerable
{
//ID编号
public int Id;
//名字
public string Name;
//年龄
public int Age;
//构造函数初始化数据
public Person(int _Id,string _Name,int _Age)
{
this.Id = _Id;
this.Name = _Name;
this.Age = _Age;
}
//alt+回车 构建 IEnumerable的函数GetEnumerator 暂不实现
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
}
//----------------------------------------第三阶段--------------------------------------
//构建一个测试用迭代器类,使其实现IEnumerator接口
//定义一个泛型参数,用于存放数据
public class Test_Enumerator<T> : IEnumerator where T : IList
{
//迭代器存储的数据
private T m_Data;
//当前索引的位置
private int m_Position = -1;
//构造迭代器时,同时传入数据
public Test_Enumerator(T _Data)
{
m_Data = _Data;
}
//实现接口的MoveNext函数,用于推进数据索引
public bool MoveNext()
{
//若索引位置>=长度-1(索引是0开始的所以-1),则返回False
if (m_Position >= m_Data.Count-1) return false;
//反之索引+1
m_Position += 1;
//返回true
return true;
}
//实现接口的Reset函数,用于重置索引
public void Reset()
{
m_Position = -1;
}
//实现接口的Current函数,用于返回当前索引的值
public object Current
{
get
{
//二次保险 若当前位置为-1或者大于等于长度,则抛出异常
if(m_Position == -1||m_Position>= m_Data.Count)
{
throw new InvalidOperationException();
}
//返回当前数据
return m_Data[m_Position];
}
}
}
//----------------------------------------第四阶段--------------------------------------
//将GetEnumerator函数具体实现
public class Person: IEnumerable
{
//ID编号
public int Id;
//名字
public string Name;
//年龄
public int Age;
//构造函数初始化数据
public Person(int _Id,string _Name,int _Age)
{
this.Id = _Id;
this.Name = _Name;
this.Age = _Age;
}
//实现GetEnumerator函数
public IEnumerator GetEnumerator()
{
//这一步看具体需求,我只是为了方便
//返回迭代器对象(Enumerator)
return new Test_Enumerator(new String[]{Id.toString,Name,Age.toString});
}
}
//----------------------------------------最终阶段--------------------------------------
//主体类
public class Program{
//入口函数
private static void Main(string[] args)
{
//实例出对象
Person temp_Person = new Person(0,"测试用人类",18);
//foreach循环调用
foreach(var temp_i in Person)
{
Console.WriteLine(temp_i);
}
//输出结果
/*
0
测试用人类
18
*/
}
}
//人类
public class Person: IEnumerable
{
//ID编号
public int Id;
//名字
public string Name;
//年龄
public int Age;
//构造函数初始化数据
public Person(int _Id,string _Name,int _Age)
{
this.Id = _Id;
this.Name = _Name;
this.Age = _Age;
}
//实现GetEnumerator函数
public IEnumerator GetEnumerator()
{
//这一步看具体需求,我只是为了方便
//返回迭代器对象(Enumerator)
return new Test_Enumerator<String>
(new String[]{Id.ToString(),Name,Age.ToString()});
}
}
//测试迭代器类
public class Test_Enumerator<T> : IEnumerator where T : IList
{
//迭代器存储的数据
private T m_Data;
//当前索引的位置
private int m_Position = -1;
//构造迭代器时,同时传入数据
public Test_Enumerator(T _Data)
{
m_Data = _Data;
}
//实现接口的MoveNext函数,用于推进数据索引
public bool MoveNext()
{
//若索引位置>=长度-1(索引是0开始的所以-1),则返回False
if (m_Position >= m_Data.Count-1) return false;
//反之索引+1
m_Position += 1;
//返回true
return true;
}
//实现接口的Reset函数,用于重置索引
public void Reset()
{
m_Position = -1;
}
//实现接口的Current函数,用于返回当前索引的值
public object Current
{
get
{
//二次保险 若当前位置为-1或者大于等于长度,则抛出异常
if(m_Position == -1||m_Position>= m_Data.Count)
{
throw new InvalidOperationException();
}
//返回当前数据
return m_Data[m_Position];
}
}
}