foreach遍历条件
.net中迭代器是通过IEnumerable和IEnumerator接口来实现的。
因此string可以使用foreach进行遍历
string str = "yoyoqikinao";
foreach (var item in str)
{
Console.WriteLine(item);
}
首先我们来看看IEnumerable接口:
里面只有一个返回 IEnumerator 的方法 GetEnumerator();
IEnumerator里面有一个属性,两个方法:
使用 yield return 上下文关键字定义迭代器方法
事实上IEnumerator GetEnumerator()正常思维应该是返回一个IEnumerator类型的参数,也就是迭代器。
这是我们平常的思路。但是这样做就有个问题。这儿要new一个List,或者任何实现了IEnumerable接口的类型。这样也太麻烦了吧。要知道IEnumerable是一个常用的返回类型。每次使用都要new一个LIst,或者其他实现了该接口的类型。与其使用其他类型,不如我们自己定制一个实现了IEnumerable接口专门用来返回IEnumerable类型的类型。我们自己定制也很麻烦。所以微软帮我们定制好了。这个类是什么,那就是yield这个关键字。
自己实现迭代器
public class MyIEnumerable : IEnumerable
{
private string[] strlist;
public MyIEnumerable(string[] strlist)
{
this.strlist = strlist;
}
public IEnumerator GetEnumerator()
{
return new MyIEnumerator(strlist);//返回实现了IEnumerator接口的类MyIEnumerator
}
}
public class MyIEnumerator : IEnumerator
{
private string[] strlist;
private int position;
public MyIEnumerator(string[] strlist)
{
this.strlist = strlist;
this.position = -1;
}
public object Current
{
get {
return strlist[position]; }//获得迭代器当前的位置
}
public bool MoveNext()
{
position++;
if (position < strlist.Length)
{
return true;
}
else return false;
}
public void Reset()
{
position = -1;
}
}
与下面实现的结果是一样的
yield帮我们简化了实现IEnumerator的步骤。
参考博客:
https://www.cnblogs.com/santian/p/4389675.html
https://www.cnblogs.com/zhaopei/p/5769782.html