Foreach能够循环的本质
我们对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(); }