• 【转】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.       } 
  • 相关阅读:
    IOS中NSUserDefaults的用法(轻量级本地数据存储)
    ios:Failed to instantiate the default view controller for UIMainStoryboardFile 'Main'
    NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)"
    使用AFNetworking 报错提示
    对比iOS网络组件:AFNetworking VS ASIHTTPRequest(转载)
    iOS
    如何理解语言的跨平台性
    R语言演示功能
    R 字符串处理函数
    来自 Google 的 R 语言编码风格指南
  • 原文地址:https://www.cnblogs.com/lucode/p/12194154.html
Copyright © 2020-2023  润新知