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

【转】IEnumerable接口的一个简单示例的更多相关文章

  1. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  2. asp.net WebService的一个简单示例

    不同的系统之间经常会需要数据的交换对接,而Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范 ...

  3. Django的下载安装以及实现一个简单示例

    一.Django下载安装 Django下载链接 1. 下载Django: pip3 install django==1.11.9    (大的版本1.11不要错) 2.创建一个django proje ...

  4. Postman----登录接口返回的reponse中token值传递给其他接口的一个简单接口测试示例

    注: 在进行接口测试时,我们都需要使用登录,并且其他的接口都要在登录后进行,那么必不可少的会使用到将登录接口的reponse返回结果中的某些参数值需要进行返回,并传递给其他接口,这样才可以进行登录后的 ...

  5. 接口测试之基于LoadRunner的一个简单示例

    这几天一直在捣鼓接口测试,以下总结一下: 1.什么是接口测试:接口是指系统模块与模块之间或者系统与系统之间进行交互,一般我们用的多的是HTTP协议的接口.WebService协议的接口.还有RPC(R ...

  6. mvp(2)一个简单示例,加深理解

    参考: http://www.cnblogs.com/liuling/p/mvp-pattern-android.html 架构图: 1.View层 public interface NewsView ...

  7. 基于boost的bind与function的一个简单示例消息处理框架

    前两年开始接触boost,boost库真是博大精深:今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了. 上次文发了一 ...

  8. React的一个简单示例

    首发:个人博客,更新&纠错&回复 React的核心是定义组件类,组件有三个要素:状态.行为.界面. 1.渲染状态到界面:状态由组件对象的state属性持有,从状态到界面的渲染工作由组件 ...

  9. .Net Attribute详解(上)-Attribute本质以及一个简单示例

    Attribute的直接翻译是属性,这和Property容易产生混淆,所以一般翻译成特性加以区分.Attribute常常的表现形式就是[AttributeName], 随意地添加在class, met ...

随机推荐

  1. 杭电-------2032杨辉三角(C语言写)

    #include<stdio.h> ][] = { }; void init() { int i, j; ; i < ; i++) { a[i][] = ; a[i][i] = ; ...

  2. 基于 HTML5 和 Canvas 实现的 3D 垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...

  3. (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

  4. Ajax0001:ajax介绍 JSON数据处理

  5. 怎样将应用程序快捷方式添加到win10开始菜单栏中去

    怎样将应用程序快捷方式添加到win10开始菜单栏中去 找到需要固定的应用程序的安装文件的位置,右键,在弹出的菜单中选择“固定到开始屏幕”即可. 或者是找到需要固定到开始菜单的应用程序的快捷方式,右键, ...

  6. Django 表关系的创建

    Django 表关系的创建 我们知道,表关系分为一对多,多对多,一对一 我们以一个图书管理系统为背景,设计了下述四张表,让我们来找一找它们之间的关系 Book与Publish表 找关系:一对多 左表( ...

  7. python学习---文件修改

    1.读一行,写一行,判断字符串,修改之. f=open("yesterday2","r",encoding="utf-8") f_new=o ...

  8. Eclipse jee最新版国内镜像点下载方式

    Eclipse jee是Eclipse的JavaEE版本,官网服务器在国外,无条件下载的可以使用国内镜像点 清华大学网站镜像网站资料,可用于下载其它版本的Eclipsehttps://mirrors. ...

  9. java 测试 (junit+ junit 断言 + postman)

    实际开发中,除了开发,我想测试也是必不可少的一环吧.从简单的@Test .main 方法测试 到 页面测试 ,断言,postman. bug是无处不在,随时发生的事,高效率的调试.检测可以节省大量的开 ...

  10. Python3 协程相关 - 学习笔记

    什么是协程 协程的优势 Python3中的协程 生成器 yield/send yield + send(利用生成器实现协程) 协程的四个状态 协程终止 @asyncio.coroutine和yield ...