using System;
using System.Collections;

namespace EnumeratorAndEnumerable
{
    ///一、引言
    //C#的Enumerator(枚举数) 和 Enumerable(可枚举类型)
    //数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做Enumerator(枚举数)的对象。Enumerator(枚举数)可以依次返回数组的元素。
    //对于有Enumerator的类型而言,必须有一个方法来获取他们。在.Net中获取一个对象Enumerator的标准方法是调用对象的GetEnumerator()方法。
    //实现了GetEnumerator方法的类型,叫做Enumerable(可枚举类型)
    ///二、Enumerator 和 Enumerable 的区别和联系
    //Enumerator(枚举数)是可以依次返回集合项的类对象,Enumerable(可枚举类型)是带有GetEnumerator方法的类型,他返回Enumerator(枚举数)
    //当foreach被用来遍历Enumerable(可枚举类型)时,他就会执行如下的行为:
    //  1、通过调用Enumerable的GetEnumetator方法获取对象的Enumerator枚举数。
    //  2、从枚举数中请求每一项并且把它作为迭代变量,代码可以读但不可以改变。
    ///三、可以用以下方式来实现枚举数
    //  1、IEnumerator接口,IEnumerable接口,叫做非泛型接口形式
    //  2、IEnumerator<T>,IEnumerable<T>,叫做泛型接口形式
    //  3、不使用接口形式。

///四、IEnumerator接口包含3个函数成员:Current,MoveNext,Reset
    //         4.1:Current 返回序列中当前项的属性,他是一个只读属性,返回Objeck类型的的引用,可以返回任何类型。
    //         4.2:MoveNext 把枚举数位置前进到集合的下一项的方法,返回布尔值,指示新位置是有效位置还是已经超过了序列尾部,若超过返回false
    //         4.3:Reset 方法把位重置为原始状态
    /// <summary>
    /// ///
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            int[] myArray = { 10,11,12,13};
            //通过调用Enumerator 的MoveNext()方法和Current属性,手动遍历数组中的元素
            Console.WriteLine("手动遍历元素:");
            IEnumerator ie = myArray.GetEnumerator();
            while (ie.MoveNext())//Enumerator的初始位置是-1,所以想要获取第一个元素就必须执行MoveNext()方法
            {
               Console.WriteLine((int)ie.Current);
            }
            //使用foreach直接进行遍历
            Console.WriteLine("通过调用foreach直接获取数组元素:");
            foreach (var i in myArray)
            {
               Console.WriteLine(i);
            }

//枚举数类型
            ColorEnumerator ce = new ColorEnumerator(new string[] { "Red", "Purple", "Yellow", "Blue" });
            while (ce.MoveNext())
            {
                Console.WriteLine(ce.Current);
            }
            //如果要用foreach来遍历,就需要在定义一个Enumerable(可枚举类型)的类
            Console.WriteLine("------------");
            MyColorEnumerable me = new MyColorEnumerable();
            foreach (var m in me)
            {
                Console.WriteLine(m);
            }
            Console.ReadLine();
        }
    }

/// <summary>
    /// 定义一个保存颜色名称的  枚举数类
    /// </summary>
    class ColorEnumerator : IEnumerator
    {
        private string[] Colors;//颜色集合
        /// <summary>
        /// 初始位置
        /// </summary>
        private int Position = -1;
        /// <summary>
        /// 当前项
        /// </summary>
        public object Current
        {
            get {
                if (Position == -1)
                {
                    throw new InvalidOperationException();
                }
                if (Position == Colors.Length)
                {
                    throw new InvalidOperationException();
                }
                return Colors[Position];
            }
        }

/// <summary>
        /// 将位置移到集合的下一项
        /// </summary>
        /// <returns></returns>
        public bool MoveNext()
        {
            if (Position < Colors.Length - 1)
            {
                Position++;
                return true;
            }
            else
            {
                return false;
            }
        }

/// <summary>
        /// 重置 集合的 位置
        /// </summary>
        public void Reset()
        {
            Position = -1;
        }

/// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="theColors"></param>
        public ColorEnumerator(string[] theColors)
        {
            Colors = theColors;
        }
    }

/// <summary>
    /// 定义 可枚举数类型 为ColorEnumerator实现foreach方法
    /// </summary>
    class MyColorEnumerable : IEnumerable
    {
        string[] MyColor = new string[] { "Red", "Purple", "Yellow", "Blue" };

public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(MyColor);
        }
    }

///五、总结
   //如果想遍历一个对象中的所有元素,可以把对象设为枚举数类型(实现IEnumerator接口)和可枚举的类类型(实现IEnumerable接口)。
   //前者需要实现IEnumerator接口的Current,MoveNewx,Reset成员函数,后者需要实现IEnumerable接口的GetEnumerable的成员函数,
    //由于GetEnumerator的返回类型是IEnumerator对象,所以还要建立一个派生与IEnumerator的枚举数类,在这个类中实现Current,MoveNewx,Reset成员函数
    //派生与IEnumerator的类可以使用foreach代码来遍历对象中的全部元素

}

C#的Enumerator(枚举数) 和 Enumerable(可枚举类型)相关推荐

  1. C#的枚举数(Enumerator)和可枚举类型(Enumerable)

    数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...

  2. js 对象中,可枚举性(enumerable)是什么?

    js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...

  3. c语言枚举法在单片机的应用,小学三年级奥数 第七讲 枚举法(一)(学生版).doc

    第七讲 枚举法(一) 学习内容:用枚举法一一列举可能的情况 学习目标:1.做到不重补漏,把复杂的问题简单化 2.按照一定的规律,特点去枚举 3.从思想上认识到枚举的重要性 课题引入 枚举法是一种常见的 ...

  4. JS中可枚举属性(enumerable)和propertyIsEnumerable()

    什么是可枚举属性 枚举就是列举,可枚举属性就是可以列举的属性,直白一点就是可以用for in遍历到的属性. propertyIsEnumerable()的用法 obj.propertyIsEnumer ...

  5. 集合在枚举数实例化后进行了修改_(编程知识)C# 枚举与位枚举

    一.枚举的概念: C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型): 二.枚举的定义: 声明 enum 变量: enum {enumeration list}; 其中 ...

  6. c语言枚举法课程设计报告,枚举法的程序实现及优化

    计新明 内容分析 本部分内容是教育科学出版社出版的必修1<数据与计算>第四单元第一节中的内容,整本书的思路是初始数据与计算.编程计算.认识数据.计算与问题解决.数据分析与人工智能,第四章属 ...

  7. C语言基本数据类型笔记整理(整型、实型/浮点型、字符型、枚举型、构造类型、指针类型、空类型)

    C语言基本数据类型 一.整型 ①有符号整型 ②无符号整型 二.实型 三.字符型 四.枚举型 五.构造类型 ①数组 ②结构体 ③共用体 六.指针类型 七.空类型 一.整型 ①有符号整型 有符号整型 关键 ...

  8. java 枚举使用简书_java枚举类型使用和详解

    1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...

  9. java 枚举迭代_Java中的枚举和迭代器之间的区别

    java 枚举迭代 Java中的枚举与迭代器 (Enumeration vs Iterator in Java) Here, we will see how Enumeration differs f ...

最新文章

  1. 【C++】C/C++ 中多态情形下的虚函数表查看方法
  2. 练习 hdu 5523 Game
  3. 关于ARP、MAC、IP欺骗以及TCP劫持
  4. Jzoj4458 密钥破解——Pollard-rho
  5. 为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?
  6. 在.net中加载dll的一种错误问题原因及处理
  7. 多个域名向主域名自动跳转的Nginx配置
  8. 求两个链表的第一个公共结点各种情况及三种思路分析
  9. spring boot——MockMvc的用法 (SpringBoot 1.5.18)下测试通过
  10. 基于android鲜花销售app,基于Android的鲜花APP设计任务书
  11. 448.找到所有数组中消失的数字
  12. 百度云盘群组中资源文件实时同步更新保存到自己群组的方法
  13. 查看文件和文件夹大小
  14. App中使用微信公众号的模版消息来进行消息推送
  15. Java 拾遗补阙 ----- Switch case语句
  16. 教你如何关闭Win7视频预览节约资源
  17. CSDN20181213博客黑板报
  18. 卡了一年的联通IPTV,能查的都查了,最后发现是电源的问题
  19. 计算机网络的发展历史
  20. C编译器剖析_5.3.2 中间代码生成及优化_switch语句的翻译

热门文章

  1. java笛卡尔积算法_Java 笛卡尔积算法的简单实现
  2. 为什么妈妈带娃容易崩溃,托班老师带那么多娃却不会?
  3. java一行代码输出数组内容
  4. python3ide手机版_Pydroid3下载-Pydroid3 IDE集成开发环境APP 4.01_arm64 安卓版-我游网
  5. Yolov5 (v6.1)添加注意力机制
  6. 读美团的营销业务实践以及领域驱动设计有后感
  7. 深度学习1:环境安装(windows系统+本机显卡)
  8. 地摊都没能带火的全国经济,它却这样带火了
  9. Slurm学习笔记(二)
  10. 学生专用计算机的小游戏,最适合学生党的三款笔记本电脑,办公游戏两不误!...