在开发中我们经常会用到 IEnumerable<T> xxx 或者 List<T> xxx 这种集合或者集合接口,实际上就是一个线性表嘛
然后结合C#提供的语法糖 foreach 遍历 用起来真的是清甜,哈哈,闲话不多说 下面直奔主题
1.枚举器和可枚举类型
foreach语句可以循环一次取数组中元素的原理:数组可以提供一个枚举器Enumerator的对象,枚举器可以知道元素的次序。
获取一个对象枚举器的方法是调用对象的GetEnumerator方法。实现了GetEnumerator方法的类型叫做可枚举类型Enumerable。
2 IEnumerator接口
实现了IEnumerator接口的枚举器包含3个函数成员:Current、MoveNext以及ReSet
IEnumerator接口 可以看到 GetEnumerator() 抽象方法 并且返回的是IEnumerable 对象

IEnumerator 接口 三个 抽象成员 Current 当前对象 foreach 中 遍历的的 item项 应该就是返回的这个属性 MoveNext()方法 移动到下一个元素
这里有没有想起 Node * next 啊 哈哈哈~(忽略) 当然 IEnumerator<T> 必然也是 继承IEnumerator的
下面 我就写一个 QueueList<T> 来实现下IEnumerable<T> 当然接口IEnumerable<T> 也是是继承IEnumerable的 这里就不贴码了
 public class QueueList<T> : IEnumerable<T>
{
public T[] list =new T[]; // 并不严谨望广大网友更正
public int length;
public int index =;
public IEnumerator<T> GetEnumerator()
{
return new QueuelistEnumerator<T>(this);
} public void Add(T element)
{
list[index] = element;
length++;
index++;
} IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
这里用数组模拟下 因为我们常用的list是不限长度的可以自动扩容 而我这个可以明显的看到当 QueueList中的元素超过50时候就会报错了 暂时就用这个代替下
接下来 枚举器类 QueuelistEnumerator<T>继承 IEnumerator<T>
  public class QueuelistEnumerator<T> : IEnumerator<T>
{
private T current;
// public T Current =>current; public T Current { get { return current; } } object IEnumerator.Current => throw new NotImplementedException(); public int index; public QueueList<T> queuelist; public QueuelistEnumerator(QueueList<T> _list)
{
queuelist = _list;
index = -1;
} public void Dispose()
{ } public bool MoveNext()
{
if (index < queuelist.length - 1)
{
current = queuelist.list[++index];
return true;
}
else
{
current = default(T);
return false;
}
} public void Reset()
{
index = -1;
}
}
接下来我们就测试下 QueueList<T>

效果还行哦 哈哈~ 不是很完备还请大佬们多多指正.......
 

关于IEnumerator<T>泛型枚举器 和 IEnumerable<T>的更多相关文章

  1. C#图解教程 第十八章 枚举器和迭代器

    枚举器和迭代器 枚举器和可枚举类型 foreach语句 IEnumerator接口 使用IEnumerable和IEnumerator的示例 泛型枚举接口迭代器 迭代器块使用迭代器来创建枚举器使用迭代 ...

  2. C# 枚举器和迭代器

    一.枚举器(enumerator)和可枚举类型(enumeration) 我们都知道foreach语句可以用来遍历数组中的元素,但你有没有想过为什么它可以被foreach处理呢? 这是因为数组可以按需 ...

  3. C#知识点-枚举器和迭代器

    一.几个基本概念的理解 问题一:为什么数组可以使用foreach输出各元素 答:数组是可枚举类型,它实现了一个枚举器(enumerator)对象:枚举器知道各元素的次序并跟踪它们的位置,然后返回请求的 ...

  4. C# 枚举器(enumerator)

    总结: 1.枚举器就像是序列中的"游标"或"书签".可以有多个"书签",移动其中任何一个都可以枚举集合,与其他枚举器互不影响.用来遍历数据结 ...

  5. C#-14 枚举器和迭代器

    一 枚举器和可枚举类型 当我们为数组使用foreach语句时,这个语句为我们依次取出了数组中的每一个元素. var arrInt = new int[] { 11, 12, 13, 14 }; for ...

  6. c# foreach枚举器

    要是自己的类支持foreach ,必须在类中必须有GetEnumerator方法,该方法返回的是一个IEnumerator类型的枚举器; public class MyStruct { public ...

  7. C#2.0中使用yield关键字简化枚举器的实现

    我们知道要使用foreach语句从客户端代码中调用迭代器,必需实现IEnumerable接口来公开枚举器,IEnumerable是用来公开枚举器的,它并不实现枚举器,要实现枚举器必需实现IEnumer ...

  8. C#中的枚举器

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月28日. 一.先从可枚举类型讲起 1.1 什么是可枚举类型? 可枚举类型,可以简单的理解为: 有一个类,类中有挺多的数据,用一种统 ...

  9. C#中的foreach语句与枚举器接口(IEnumerator)及其泛型 相关问题

    这个问题从<C#高级编程>数组一节中的foreach语句(6.7.2)发现的. 因为示例代码与之前的章节连贯,所以我修改了一下,把自定义类型改为了int int[] bs = { 2, 3 ...

随机推荐

  1. Java远程访问接口的几种方式

    一.Java访问远程url接口并获取结果 1.原生JavaAPI获取 package com.util; import java.io.DataOutputStream; import java.io ...

  2. POJ 3252 Round Number(数位DP)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6983   Accepted: 2384 Des ...

  3. Codeforces 923 D. Picking Strings

    http://codeforces.com/contest/923/problem/D 题意: A-->BC , B-->AC , C-->AB , AAA-->empty 问 ...

  4. Linux下sh文件运行及桌面环境双击运行sh文件

    sh文件运行: 1.修改为可执行权限: chmod u+x hello.sh 2.运行 ./hello.sh 3.不使用可执行权限修改,用sh直接运行 sh ./hello.sh 桌面环境双击运行sh ...

  5. Spring Mvc Web 配置拦截规则与访问静态资源 (三)

    拦截规则配置 1. *.do <!-- Processes application requests --> <servlet> <servlet-name>app ...

  6. 雨林木风ghostwin7纯净版系统下载

    雨林木风ghostwin7纯净版系统下载 关于easyuidatagrid的问题,跪求老司机带带我..... 关于cst_modesys/stat.h一个问题求解答谢谢 [程序]STM32使用SPI接 ...

  7. 第7月第20天 epoll

    1. ) { struct sockaddr in_addr; socklen_t in_len; int infd; char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; ...

  8. 由一篇吐槽对String空字符串判断的文章所引发的碎碎念

    一.起因 最近有篇关于String空字符串判断的文章火了,老是看到这篇文章,既然如此我也只好认真看了下:程序员晒出一段代码引来无数网友狂喷!网友:你就活该当码农! 我也觉得这段代码写的不怎么的,首先程 ...

  9. 2017/05/22 java 基础 随笔

    多态:一种事物多种形态 前提:1.子父类继承关系 2.方法复写.重写 3.父类引用指向子类对象 成员变量: package com.huawei; public class Demo1 { publi ...

  10. 洛谷 P4609: [FJOI2016] 建筑师

    本省省选题是需要做的. 题目传送门:洛谷P4609. 题意简述: 求有多少个 \(1\) 到 \(N\) 的排列,满足比之前的所有数都大的数正好有 \(A\) 个,比之后的所有数都大的数正好有 \(B ...