構建可列舉型別(IEnumerable和IEnumerator介面)
1.IEnumberable介面
public interface IEnumberable
{
IEnumerator GetEnumerator(); //返回對另一個介面的引用IEnumerator
}
2.IEnumerator介面
public interface IEnumerator
{
bool MoveNext(); //將游標的內部位置向前移動
object Current { get; } //獲取當前的項
void Reset(); //將游標重置到第一個成員前面
}
3.實現可列舉型別
public class MyClass1
{
public string Name { get; set; }
public string Id { get; set; }
}
public class MyClass2:IEnumerable
{
private MyClass1[] carArray = new MyClass1[4];
public MyClass2()
{
carArray[0] = new MyClass1 { Name = "Test1", Id = "1" };
carArray[1] = new MyClass1 { Name = "Test2", Id = "2" };
carArray[2] = new MyClass1 { Name = "Test3", Id = "3" };
}
public IEnumerator GetEnumerator()
{
return new MyClass3(carArray);
}
}
public class MyClass3:IEnumerator
{
private MyClass1[] myCls1 = null;
private int count = 0;
public MyClass3(MyClass1[] myCls1)
{
this.myCls1 = myCls1;
}
public object Current
{
get { return myCls1[count]; }
}
public bool MoveNext()
{
count = count+1;
if (count >= myCls1.Length)
{
return false;
}
else
{
return true;
}
}
public void Reset()
{
count = 0;
}
}
public class MyClass4
{
private void Func1()
{
MyClass2 cls2 = new MyClass2();
foreach (MyClass1 item in cls2)
{
item.Name = "1";
item.Id = "20";
}
}
}
4.使用yield關鍵字構建迭代器方法
public class MyClass2 : IEnumerable
{
private MyClass1[] carArray = new MyClass1[4];
public MyClass2()
{
carArray[0] = new MyClass1 { Name = "Test1", Id = "1" };
carArray[1] = new MyClass1 { Name = "Test2", Id = "2" };
carArray[2] = new MyClass1 { Name = "Test3", Id = "3" };
}
public IEnumerator GetEnumerator()
{
//return new MyClass3(carArray);
foreach (MyClass1 cls1 in carArray)
{
yield return cls1;
}
}
}
編譯器幫我們生成了相關的類