【转】IEnumerable接口的一个简单示例

转:https://blog.csdn.net/wang371756299/article/details/8197075
摘要: 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.       } 
posted @ 2020-01-14 21:23  阳光#  阅读(133)  评论(0编辑  收藏  举报