1 IEnumerable 提供可枚举的能力,只有实现该接口才可以使用foreach对象迭代对象
其接口包含的方法
IEnumerator GetEnumerator()
该接口中包含实现迭代提供的值序列或者自定义值序列,然后对其进行迭代
public class Test
{
TestIEnumeratable test = new TestIEnumerable ()
IEnumerator item = test.GetEnumerator();//枚举器只是提供的一个壳真正实现迭代还迭代器
while(item.MoveNext())
{
Console.WriteLine(item.Current.GetType());
}
}
public class TestIEnumerable
{
//这个方法内部就是提前准备好要迭代的对象,自身并不实现迭代
public IEnumerator GetEnumerator()
{
yield return "damon01"
yield return "damon02"
}
}
该方法体中也可以使用yield创建一个迭代器然后返回
public class TestIEnumerable:IEnumerable
{
IEnumerator GetEnumerator()
{
yield return 1; //这里通过yield 创建迭代器并且返回1 和2的值序列
yield return 2;
}
}
直接返回一个自定义的迭代器类
public class TestIEnumerable:IEnumerable
{
IEnumerator GetEnumerator()
{
return new TestIEnumerator(); //这里直接返回的就是一个自定义的迭代器
}
}
public TestIEnumerator:IEnumerator
{
public TestIEnumerator()
{
}
......
}
2 IEnumerator 提供可以迭代的值序列,供枚举器使用
包含普通接口IEnumerator和泛型接口IEnumerator
其接口方法包含
bool MoveNext() //这里的MoveNext可以自定义返回满足的条件true
Object Current
void Reset()
比较经典的用法
public class HelloIEnumerator : IEnumerator, IEnumerator<string>
{
private int m_State;
private string current;
public HelloIEnumerator(int state)
{
this.m_State = state;
}
object IEnumerator.Current
{
get { return current; }
}
string IEnumerator<string>.Current
{
get { return current; }
}
public void Dispose()
{
}
public bool MoveNext()
{
switch (m_State)
{
case 0:
m_State = 1;
current = "Hello";
return true;
case 1:
m_State = 2;
current = "world";
return true;
case 2:
break;
}
return false;
}
public void Reset()
{
m_State = 0;
current = "";
}
}
public class GameMove
{
public IEnumerator cross;
private IEnumerator circle;
private int moveStemp = 0;
public GameMove()
{
this.cross = Cross();
this.circle = Circle();
}
public IEnumerator Cross()
{
while (moveStemp++ < 9)
{
string temp = "cross: moveStemp"+moveStemp;
Console.WriteLine(temp);
yield return circle;
}
}
public IEnumerator Circle()
{
while (moveStemp++ < 9)
{
string temp = "circle: moveStemp" + moveStemp;
Console.WriteLine(temp);
yield return cross;
}
}
}