枚举器小小总结
一.IEnumerable、IEnumerable <T>接口
C#中对于所有数组,集合都可以用foreach遍历,如:
List<string> list=new List<string>();
foreach(string str in list)
{
Console.WriteLine(str);
}
这是因为这些类都实现了IEnumerable或IEnumerable <T>接口。
二.自己写的类,实现IEnumerable接口,用foreach来遍历
public class Person:IEnumerable <string>
{
public Person()
{
_names=new string[]{“shadow”,”TianJie”,”Tom”,”Joly”};
}
private string[] _names;
public IEnumerator<string> GetEnumerator()
{
return new MyEnumerator(_names);
}
}
public MyEnumerator:IEnumerator<string>
{
public MyEnumerator(string[] names)
{
this._names=names;
}
private string[] _names;
private int _index=-1;
public string Current
{
get
{
return _names[_index];
}
}
public bool MoveNext()
{
return ++_index<this._names.Length;
}
public void Reset()
{
_index=-1;
}
public void Dispose()
{
}
}
于时,可用以下方法遍历Person类中的_names数组:
Person p=new Person();
foreach(string str in p)
{
Console.WriteLine(str);
}
它就相当于:
Person p=new Person();
MyEnumerator<string> etor=p.GetEnumerator();
try
{
while(etor.MoveNext())
{
Console.WriteLine(etor.Current);
}
}
finally
{
etor.Dispose();
}
三.由于上述方法太过繁琐,也可以用yield关键字
public class Person:IEnumerable <string>
{
public Person()
{
_names=new string[]{“shadow”,”TianJie”,”Tom”,”Joly”};
}
private string[] _names;
public IEnumerator<string> GetEnumerator()
{
for(int i=0;i<_names.Length;i++)
{
yield return _names[i];
}
}
}
当然,它本质上和第二条说的方法是一样的,通过反编译器就可以发现。