您的位置:首页 > 其它

Foreach能够循环的本质

2016-04-13 15:01 204 查看
我们对foreach循环并不陌生,在C#中我们用得非常多,但是我们是否清楚foreach循环的本质呢? 众所周知,foreach循环能够遍历 数组 ,集合 。但是我们自己定义的一个类是否能够通过foreach循环遍历出来呢?

Foreach能够遍历的数据类型都是实现了 IEnumerable 接口的 意思就是说 只要我自定义的类实现了 IEnumberable接口 我都能够通过foreach来循环遍历

下面举一个简单的例子

首先自定义一个类 并实现 IEnumberable 接口

在Mylist类中,实现了IEnumberable接口后 必须 实现其中的 GetEnumberator()方法 而GetEnumberato方法中的返回值类型是 IEnumberator接口 类型

所以我们就自然而然想到了定义一个类 来实现 IEnumberator接口 利用里氏替换原则 返回子类类型

public  class Mylist:IEnumerable
{
ArrayList list = new ArrayList();
//写一个自定义的Add方法()
public void Add(object ob)
{
list.Add(ob);
}
//实现IEnumerable接口的GetEnumerator()方法
public IEnumerator GetEnumerator()
{
return new MyTool(list);
}
}


/// <summary>
/// 实现  IEnumberyor接口时  必须实现该接口的  所有方法  即  Current()  :  返回一个集合中的一项的值
///                                                          MoveNext() :  系统自动调用MoveNext()方法
///                                                          Reset()   :    系统会在MoveNext方法返回一个false值的时候自动调用  将索引值重置
/// </summary>
public class MyTool : IEnumerator
{
ArrayList list = new ArrayList();
public MyTool(ArrayList li)
{
list=li;
}
int i = -1;//给定初始位置  表示第一条数据之前
//Current属性
public object Current
{
get { return list[i]; }
}

//自动调用MoveNext方法  调用下一条记录
public bool MoveNext()
{
bool Result = false;
if(i<list.Count-1)
{
i++;
Result = true;
}
return Result;
}

public void Reset()
{
i = -1;
}
}


以上 foreach 循环的 本质 就是这些了

以下代码就是实现自定义类 用foreach循环实现

static void Main(string[] args)
{
Mylist list = new Mylist();
list.Add("张三");
list.Add("李四");
list.Add("王五");

foreach (object item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: