foreach原理
IEnumerator GetEnumerator()在using System.Collections;命名空间。
using System;
using System.Collections;
public class Program
{
public static void Main()
{
BookShelf bs = new BookShelf()
{
AllBooks = new IRead[]
{
new Book1(),
new Book2(),
new Book3()
}
};
foreach(var item in bs)
{
Console.WriteLine(item);
}
Console.WriteLine("END");
}
}
//原理
public class BookShelf //:IEnumerable
{
public IRead[] AllBooks{get;set;}
public IEnumerator GetEnumerator()
{
//throw new NotImplementedException();
return new MyIEnumerator(){ Target = AllBooks };
}
}
//迭代器
public class MyIEnumerator:IEnumerator
{
public IRead[] Target{get;set;}
public int index=-1;
//2.获取当前元素
public object Current{get{return Target[index];}}
//1.先移动到下一元素,返回一个bool值。
public bool MoveNext()
{
index++;
return index<=Target.Length-1;
}
public void Reset(){}
}
public class Book1:IRead
{
public void Read()
{
Console.WriteLine("C++");
}
}
public class Book2:IRead
{
public void Read()
{
Console.WriteLine("C#");
}
}
public class Book3:IRead
{
public void Read()
{
Console.WriteLine("python");
}
}
public interface IRead
{
void Read();
}
运行结果:
Book1
Book2
Book3
END
--------------------------------------------------------------------------------------------------------------------------
简化代码
using System;
using System.Collections;
public class Program
{
public static void Main()
{
BookShelf bs = new BookShelf()
{
AllBooks = new IRead[]
{
new Book1(),
new Book2(),
new Book3()
}
};
foreach(var item in bs)
{
Console.WriteLine(item);
}
Console.WriteLine("END");
}
}
//原理 yield
public class BookShelf //:IEnumerable
{
public IRead[] AllBooks{get;set;}
public IEnumerator GetEnumerator()
{
for(int i =0;i<AllBooks.Length;i++)
{
yield return AllBooks[i];
}
}
}
public class Book1:IRead
{
public void Read()
{
Console.WriteLine("C++");
}
}
public class Book2:IRead
{
public void Read()
{
Console.WriteLine("C#");
}
}
public class Book3:IRead
{
public void Read()
{
Console.WriteLine("python");
}
}
public interface IRead
{
void Read();
}
Book1
Book2
Book3
END