C#的Enumerator(枚举数) 和 Enumerable(可枚举类型)
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(可枚举类型)相关推荐
- C#的枚举数(Enumerator)和可枚举类型(Enumerable)
数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...
- js 对象中,可枚举性(enumerable)是什么?
js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...
- c语言枚举法在单片机的应用,小学三年级奥数 第七讲 枚举法(一)(学生版).doc
第七讲 枚举法(一) 学习内容:用枚举法一一列举可能的情况 学习目标:1.做到不重补漏,把复杂的问题简单化 2.按照一定的规律,特点去枚举 3.从思想上认识到枚举的重要性 课题引入 枚举法是一种常见的 ...
- JS中可枚举属性(enumerable)和propertyIsEnumerable()
什么是可枚举属性 枚举就是列举,可枚举属性就是可以列举的属性,直白一点就是可以用for in遍历到的属性. propertyIsEnumerable()的用法 obj.propertyIsEnumer ...
- 集合在枚举数实例化后进行了修改_(编程知识)C# 枚举与位枚举
一.枚举的概念: C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型): 二.枚举的定义: 声明 enum 变量: enum {enumeration list}; 其中 ...
- c语言枚举法课程设计报告,枚举法的程序实现及优化
计新明 内容分析 本部分内容是教育科学出版社出版的必修1<数据与计算>第四单元第一节中的内容,整本书的思路是初始数据与计算.编程计算.认识数据.计算与问题解决.数据分析与人工智能,第四章属 ...
- C语言基本数据类型笔记整理(整型、实型/浮点型、字符型、枚举型、构造类型、指针类型、空类型)
C语言基本数据类型 一.整型 ①有符号整型 ②无符号整型 二.实型 三.字符型 四.枚举型 五.构造类型 ①数组 ②结构体 ③共用体 六.指针类型 七.空类型 一.整型 ①有符号整型 有符号整型 关键 ...
- java 枚举使用简书_java枚举类型使用和详解
1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...
- java 枚举迭代_Java中的枚举和迭代器之间的区别
java 枚举迭代 Java中的枚举与迭代器 (Enumeration vs Iterator in Java) Here, we will see how Enumeration differs f ...
最新文章
- 【C++】C/C++ 中多态情形下的虚函数表查看方法
- 练习 hdu 5523 Game
- 关于ARP、MAC、IP欺骗以及TCP劫持
- Jzoj4458 密钥破解——Pollard-rho
- 为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?
- 在.net中加载dll的一种错误问题原因及处理
- 多个域名向主域名自动跳转的Nginx配置
- 求两个链表的第一个公共结点各种情况及三种思路分析
- spring boot——MockMvc的用法 (SpringBoot 1.5.18)下测试通过
- 基于android鲜花销售app,基于Android的鲜花APP设计任务书
- 448.找到所有数组中消失的数字
- 百度云盘群组中资源文件实时同步更新保存到自己群组的方法
- 查看文件和文件夹大小
- App中使用微信公众号的模版消息来进行消息推送
- Java 拾遗补阙 ----- Switch case语句
- 教你如何关闭Win7视频预览节约资源
- CSDN20181213博客黑板报
- 卡了一年的联通IPTV,能查的都查了,最后发现是电源的问题
- 计算机网络的发展历史
- C编译器剖析_5.3.2 中间代码生成及优化_switch语句的翻译
热门文章
- java笛卡尔积算法_Java 笛卡尔积算法的简单实现
- 为什么妈妈带娃容易崩溃,托班老师带那么多娃却不会?
- java一行代码输出数组内容
- python3ide手机版_Pydroid3下载-Pydroid3 IDE集成开发环境APP 4.01_arm64 安卓版-我游网
- Yolov5 (v6.1)添加注意力机制
- 读美团的营销业务实践以及领域驱动设计有后感
- 深度学习1:环境安装(windows系统+本机显卡)
- 地摊都没能带火的全国经济,它却这样带火了
- Slurm学习笔记(二)
- 学生专用计算机的小游戏,最适合学生党的三款笔记本电脑,办公游戏两不误!...