当前位置:编程学习 > C#/ASP.NET >>

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.       }
 

 

摘自  zhoujianfei
 
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,