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;
}
}
}