[C#2] 5-迭代器

1.枚举数

枚举数是循环访问其关联集合的对象。它可被视作指向集合中任何元素的可移动的指针。 一个枚举数只能与一个集合关联,但一个集合可以具有多个枚举数。C#的foreach 语句使用枚举数并隐藏操作该枚举数的复杂性。枚举数可用于读取集合中的数据,但不能用于修改基础集合。

集合要支持foreach则需要实现System.Collections.IEnumerable接口[公开枚举数,该枚举数支持在非泛型集合上进行简单迭代, 也可以不实现该接口,该接口定义了一个方法GetEnumerator(),返回一个支持IEnumerator接口的对象,IEnumerator的成员如下:

名称

说明

bool MoveNex t方法

将枚举数推进到集合的下一个元素

void Rese t方法

将枚举数设置为其初始位置,该位置位于集合中第一个元素之前

object Current 属性

获取集合中的当前元素

写一个:

 1  
 2 public class MyCollections : IEnumerable
 3 {
 4     private string[] items;
 5     MyCollections(string[] items)
 6     {
 7         this.items = items;
 8     }
 9     public IEnumerator GetEnumerator()
10     {
11         return new MyEnumerator(this);
12     }
13     public class MyEnumerator : IEnumerator
14     {
15         private int position = -1;
16         private MyCollections mc;
17         public MyEnumerator(MyCollections mc)
18         {
19             this.mc = mc;
20         }
21         public bool MoveNext()
22         {
23             if (position < this.mc.items.Length - 1)
24             {
25                 position++;
26                 return true;
27             }
28             else
29             {
30                 return false;
31             }
32         }
33         public void Reset()
34         {
35             position = -1;
36         }
37         object IEnumerator.Current
38         {
39             get
40             {
41                 return this.mc.items[position];
42             }
43         }
44     }
45     static void Main()
46     {
47         MyCollections f = new MyCollections(
48                     new string[] { "乱舞春秋", "男", "22" });
49         foreach (string item in f)
50         {
51             Console.WriteLine(item);
52         }
53     }
54 }

2.迭代器

C#2.0以前,要使自己的集合支持foreach遍历,需要写上面一大堆代码[实现两个接口,也可不实现, 但是必须给提供这两个接口中的同名方法],C#2.0引入了yield return[返回每个元素]和yield break[终止迭代]两个组合而成的上下文关键字。 改写上述代码:

//MyEnumerable方法全部删掉
public IEnumerator GetEnumerator()
{
    for (int i = 0; i < items.Length; i++)
    {
        yield return items[i];
    }
}

就是这么简单!只需实现一个接口IEnumerable就可以了[或者说有public IEnumerator GetEnumerator()此方法就可];

像是匿名方法一样,编译器帮我们做了很多[这里编译器帮我们生成了"实现IEnumerator接口的一个类",通过查看IL代码得知]。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实用代码-JavaScript实用小函数一枚(深入对象取值)

    适用场合描述 做web开发时使用JSON作为数据传输格式时,如果服务器端传回的JSON数据对象层次嵌套过深。比如下面这段: 1 var data = { 2 ...

    blackheart
  • 如何站在使用者的角度来设计SDK-微信公众号开发SDK(消息处理)设计之抛砖引玉

    0.SDK之必备的基本素质 在项目中免不了要用到各种各样的第三方的sdk,在我现在的工作中就在公司内部积累了各种各样的的公共库(基于.net的,基于silver...

    blackheart
  • [解读REST] 4.基于网络应用的架构风格

    衔接上文[解读REST] 3.基于网络应用的架构,上文介绍了一组自洽的术语来描述和解释软件架构;如何利用架构属性评估一个架构风格;以及对于基于网络的应用架构来说...

    blackheart
  • 基于Ubuntu + anaconda + tensorflow+jupyter的python深度学习开发环境配置

    https://repo.anaconda.com/archive/Anaconda2-5.3.0-Linux-x86_64.sh

    于小勇
  • bazel 出现no such package '@org_tensorflow//tensorflow' 错误

    莫斯
  • 「镁客晚报」iOS9.1系统更流畅,苹果推ResearchKit,未来将助力医疗事业

    镁客网
  • 学习笔记TF066 : TensorFlow 移动端应用,iOS、Android系统实践

    移动端应用原理。移动端、嵌入式设备应用深度学习方式,一模型运行在云端服务器,向服务器发送请求,接收服务器响应;二在本地运行模型,PC训练模型,放到移动端预测。向...

    利炳根
  • PHP实现简单计算器小程序

    最近刚开始学习一门新的语言 PHP,然后就写了一个计算器的小程序,大体上的思路就是有一个前台程序和一个后台程序,前台程序就是界面类似下图这样的:

    砸漏
  • 最终版 Reflector v1.0 (+简单的反流程混淆)

    (0415增加简单的反流程混淆功能,满足日常使用需要,不再更新,转向ILSpy,见12点后面) Reflector过期?这可不行!自己动手吧! 看雪上拿到Ref...

    大石头
  • JTAG

    JTAG(Joint Test Action Group)联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数...

    瓜大三哥

扫码关注云+社区

领取腾讯云代金券