一、关于枚举的含义

.Net提供了可枚举类型的接口IEnumerable和枚举器接口IEnumerator,程序集System.Collections

另:

  1. IQueryable 继承自IEnumerableSystem.Core

枚举,又叫列举,顾名思义,(程序)一个一个列举出来。列举出来以方便查询应用(linq)。常见的,我们遍历一个集合(Collection)的时候,foreach不可少,在C#中有些是可以被foreach(linq查询,foreach本质是linq查询执行方法),这些数据结构

有一个特征:可枚举,像数组,List, ArryList,等,已经隐式实现了接口IEnumerable,可以返回一个IEnumerator(iteror枚举器)。

二、两个接口的定义

  1. public interface IEnumerable
  2. {
  3. //IEnumerable只有一个方法,返回可循环访问集合的枚举数。
  4. IEnumerator GetEnumerator() ;
  5. }
  6.  
  7. public interface IEnumerator
  8. {
  9. // 方法
  10. //移到集合的下一个元素。如果成功则返回为 true;如果超过集合结尾,则返回false。
  11. bool MoveNext();
  12. // 将集合设置为初始位置,该位置位于集合中第一个元素之前
  13. void Reset();
  14. // 属性:获取集合中的当前元素
  15. object Current { get; }
  16. }

二、二者的区别和联系

  1. 、一个集合可查询(可用foreachwhereany等),必须以某种方式返回IEnumerator object)也就是必须实现IEnumerable接口
  2.  
  3. IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。
  4.  
  5. 、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的
  6.  
  7. IEnumerableIEnumerator通过IEnumerableGetEnumerator()方法建立了连接。

三、具体实例

  1. namespace ConsoleApp8
  2. {
  3. public class Person
  4. {
  5. public string Name
  6. {
  7. set;
  8. get;
  9. }
  10. public Person(string name)
  11. {
  12. Name = name;
  13. }
  14. }
  15.  
  16. public class PeopleEnum : IEnumerator
  17. {
  18. public Person[] _people;
  19. int position = -;
  20. public PeopleEnum(Person[] list)
  21. {
  22. _people = list;
  23. }
  24. public bool MoveNext()
  25. {
  26. position++;
  27. return (position < _people.Length);
  28. }
  29. public void Reset()
  30. {
  31. position = -;
  32. }
  33. public object Current
  34. {
  35. get
  36. {
  37. try
  38. {
  39. return _people[position];
  40. }
  41. catch (IndexOutOfRangeException)
  42. {
  43. throw new InvalidOperationException();
  44. }
  45. }
  46. }
  47. }
  48. public class People : IEnumerable
  49. {
  50. private Person[] people;
  51. public People(Person[] pArray)
  52. {
  53. people = new Person[pArray.Length];
  54. for (int i = ; i < pArray.Length; i++)
  55. {
  56. people[i] = pArray[i];
  57. }
  58. }
  59. public IEnumerator GetEnumerator()
  60. {
  61. return new PeopleEnum(people);
  62. }
  63. }
  64.  
  65. class Program
  66. {
  67. static void Main(string[] args)
  68. {
  69. Person[] people = new Person[]
  70. {
  71. new Person("李磊"),
  72. new Person("王刚"),
  73. new Person("彤彤"),
  74. new Person("丹丹"),
  75. };
  76.  
  77. People listPeople = new People(people);
  78.  
  79. foreach (var p in listPeople)
  80. {
  81. Console.WriteLine(((Person)p).Name);
  82. }
  83.  
  84. Console.ReadLine();
  85.  
  86. }
  87. }
  88. }

  欢迎qq加群学习:568055323

C#深度学习の枚举类型(IEnumerator,IEnumerable)的更多相关文章

  1. 实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )

    下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口: using System; using System.Collections; using Syst ...

  2. android开发学习 ------- 枚举类型在Android中的用法

    一般上为了简化代码,重用代码,设置标志位来表示不同的流程,这个标志位可以使用枚举类型来表示: 1:定义 public FbManner fbManer = FbManner.EMAIL; //给一个默 ...

  3. 迭代器学习之一:使用IEnumerable和IEnumerator接口

    写博客是检验我学习的成果之一以及自我总结的一种方式,以后会经常利用这种方式进行技术交流和自我总结,其中认识不深难免会有错误,但是一直懂得不懂就问,不懂就学的道理! 1.首先看一个简单的列子 , , , ...

  4. Delphi的枚举类型

    参考:http://blog.csdn.net/kissdeath/article/details/2060573 Delphi程序不仅可以用于数值处理,还更广泛的用于处理非数值的数据.例如:性别.月 ...

  5. 【C#】构建可枚举类型(IEnumerable和IEnumerator)

    为了开始对实现既有接口的了解,我们就看一下IEnumerable和IEnumerator的作用,想一下,C#支持关键字foreach,允许我们遍历任何数组类型的内容: //遍历数组的项 ,,} for ...

  6. 关于IEnumerator<T>泛型枚举器 和 IEnumerable<T>

    在开发中我们经常会用到 IEnumerable<T> xxx 或者 List<T> xxx 这种集合或者集合接口,实际上就是一个线性表嘛然后结合C#提供的语法糖 foreach ...

  7. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  8. 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题

    原文:深度分析Java的枚举类型--枚举的线程安全性及序列化问题 枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和clas ...

  9. c语言学习笔记 - 枚举类型

    今天学习了c语言的枚举类型的使用,可能是PHP里没使用过,开始看的时候还是觉得有点怪,后来做了下例子才理解,这里做个笔记记录一下. #include <stdio.h> enum anim ...

随机推荐

  1. 升级ssh到OpenSSH_7.5p1

    Redhat 6.5 x64升级SSH到OpenSSH_7.5p1 为了防止openssh安装失败导致不能远程登录,先部署telnet服务以防万一. rpm -qa telnet telnet-ser ...

  2. HashMap深度解析

    最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片 ...

  3. Myeclipse 添加插件

    配置方式添加插件,添加一个反编译插件示例 1.官网下载(http://java-decompiler.github.io/) 2.下载到本地之后,删除多余的文件(其他的插件也是如此,例如SVN) 3. ...

  4. react-conponent-hellocynthia

    <!DOCTYPE html> <html> <head> <script src="../../build/react.js">& ...

  5. js 做账单处理

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  6. BZOJ2199: [Usaco2011 Jan]奶牛议会(2-SAT)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 559  Solved: 360[Submit][Status][Discuss] Descriptio ...

  7. 从发布订阅模式到redux(一)

    最近在学习的过程中,学习了一些关于redux的一些知识,学之前用redux,虽然会用但是实现的原理就不是特别清楚,天天沉迷于搬砖 总是这木搬砖也不是个事啊,就准备开始深入了解一些原理性的东西 首先在看 ...

  8. ACL技术总结

    1.ACL的全称是访问控制列表,本质上是定义一组策略,以便指导报文在交换机内部的转发行为. 2.要配置策略,首先要明确ACL应用的对象,可以是针对端口,也可以是针对特殊的一条流. 针对端口,就是指端口 ...

  9. Python 'xxx' codec can't decode byte xxx常见编码错

    'xxx' codec can't decode byte xxx常见编码错误处理 by:授客 QQ:1033553122 测试环境 python 3.3.2 win7 问题描述 利用python文件 ...

  10. 兼容性问题:backgroud-size支持IE8浏览器的方法

    在工作中碰到一个问题:background-size是css3的新属性,当在IE8及其以下浏览器中不起作用,导致背景图片不能自适应元素的大小? 先看一个小demo: <!DOCTYPE html ...