zoukankan      html  css  js  c++  java
  • 【转】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.       } 
  • 相关阅读:
    JVM问题定位分析(一)
    性能分析--上下文切换(context switch)
    JVM--如何通过软引用和弱引用提JVM内存使用效率
    docker挂载文件宿主机与容器内部数据不同步问题
    使iptables规则在CentOS 7中持久化
    dstat
    curl
    Django REST framework 之JWT认证
    【区别】摘要、数字签名、数字证书
    使用django.core.mail的EmailMultiAlternatives发送邮件a标签链接不生效问题
  • 原文地址:https://www.cnblogs.com/lucode/p/12194154.html
Copyright © 2011-2022 走看看