IEnumerable接口的一个简单示例

来源:互联网 发布:a* b*算法 编辑:程序博客网 时间:2024/06/05 21:52
摘要: IEnumerable接口是实现foreach循环的一个重要的接口,像数组、集合等之所以可以用foreach循环遍历其中的每个元素便是因为他们都实现了IEnumerable接口而,那么这个接口到底是如何运行的呢,通过下面一个例子可以得到 ...

 

IEnumerable接口是实现foreach循环的一个重要的接口,像数组、集合等之所以可以用foreach循环遍历其中的每个元素便是因为他们都实现了IEnumerable接口而,那么这个接口到底是如何运行的呢,通过下面一个例子可以得到一些启发。

定义一个这样简单的类:

01.public class Person  02.    {  03.        private string[] names= new string[] { "A", "B", "C" };  04.    }  

由于names属性是私有属性,所以无法通过Person类的对象对其进行访问,也就无法对其遍历,可以让Person类实现IEnumerable接口来对其进行遍历,实现接口后的类如下:

01.public class Person : IEnumerable  02.    {  03.        private string[] names= new string[] { "A", "B", "C" };  04.       05.        public IEnumerator GetEnumerator()  06.        {  07.              08.        }   09.    }  

可以看到实现了IEnumerable接口后Person类里面必须实现一个GetEnumerator函数,该函数返回的是一个类型为IEnumerator 的对象,于是我们再写一个类继承自IEnumerator 接口:

01.public class PersonEnumerator : IEnumerator  02.   {  03.       //定义一个字符串数组  04.       private string[] _names;  05.  06.       //遍历时的索引  07.       private int index = -1;  08.  09.       //构造函数,带一个字符串数组的参数  10.       public PersonEnumerator(string[] temp)  11.       {  12.           _names = temp;  13.       }  14.  15.       //返回当前索引指向的names数组中的元素  16.       public object Current  17.       {  18.           get { return _names[index]; }  19.       }  20.  21.       //索引,判断是否遍历完成  22.       public bool MoveNext()  23.       {  24.           index++;  25.           if (index < _names.Length)  26.           {  27.               return true;  28.           }  29.           else  30.               return false;  31.       }  32.  33.       //重置索引的值,以便下一次遍历  34.       public void Reset()  35.       {  36.           index = -1;  37.       }  38.   }  

然后对GetEnumerator函数稍加修改就大功告成了,如下:

01.public class Person : IEnumerable  02.   {  03.       private string[] names = new string[] { "A", "B", "C" };  04.      05.       public IEnumerator GetEnumerator()  06.       {  07.           //调用PersonEnumerator类的构造函数,并Person类中的names数组传递过去  08.           return new PersonEnumerator(names);  09.       }   10.   }  

然后就可以用foreach对Person类的对象进行遍历了,如下:

01.static void Main(string[] args)  02.        {  03.            Person p1 = new Person();  04.            foreach (string item in p1)  05.            {  06.                Console.WriteLine(item);  07.            }  08.            Console.ReadKey();  09.        }  

我们也可以用如下方法对names数组进行遍历:

01.static void Main(string[] args)  02.       {  03.           Person p1 = new Person();  04.           IEnumerator rator = p1.GetEnumerator();  05.           while (rator.MoveNext())  06.           {  07.               Console.WriteLine(rator.Current);  08.           }  09.           Console.ReadKey();  10.       }