系列介绍

简介

【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。

场景

您可以在下班坐地铁的时候,拿出手机逛一逛博客园,利用短短的五分钟完成阅读。

诞生缘由

  • 曾经学过的内容可能过不了多久就忘了,我们需要一些文章来帮我们查漏补缺。
  • 太长篇幅的文章看着滚动条就害怕了,我们可能更期望文字少的文章。
  • .net体系的内容太多了,平时也不知道该学哪些,我们可能需要一点点知识线索。

文章质量

当然,并不意味着它篇幅短就质量差。所谓麻雀虽小五脏俱全,我们会尽可能保证利用最少的文字去详细的阐述内容。

正文

IEnumerableIEnumerator,如果不仔细看,是不是都以为它们是同样的一个单词。特别是我们习惯了每天看大量的中文,这种只是很小区别的单词更是容易犯错。

在.NET的世界里好像有这种类似单词的情况还真的不少,比如AuthenticationAuthorization(认证和授权)。记得第一次见着它俩的时候,我说怎么看了半天怎么第一部分是它,第二个部分还是它?甚至我一度以为它们是同一个东西。(关于认证和授权将在后期为大家介绍。)

好的,回到今天的主题:IEnumerableIEnumerator。目前我们知道它俩是不一样的东西了,至少从单词层面(ง •_•)ง。那么在 DotNET 中,它们扮演着怎么样的角色呢?

先来看看它们的样子:

IEnumerable说:我提供了公开枚举器,并且该枚举器支持在非泛型集合上进行简单迭代的功能。

IEnumerator说:我提供了支持对非泛型集合进行简单迭代的功能。

其实看接口的样貌我们就大概能够理解其中的奥秘了,IEnumerable 提供了可以迭代的能力,而这种能力是通过内部的可迭代对象来实现了,这个对象就是IEnumerator

所以我们来想一下我们在.NET中经常用到的可迭代的对象有哪些呢? 是的,你可能第一个就会想到List。那我们就来查看IList的接口继承关系:

public interface IList : ICollection, IEnumerable

果不其然,它继承了IEnumerable接口。那么这种具有了可迭代能力的对象有什么好处呢? foreach,没错,它可以享受foreach的语法糖啦。如果您了解过foreach的原理,您就知道,它其实是C#为我们对一下代码的包装:

IEnumerator<string> enumeratorLst = IEnumerableClass.GetEnumerator();
while (enumeratorLst.MoveNext())
{
Console.WriteLine(enumeratorLst.Current);
}

所以,一层一层的抽丝剥茧,原来脱掉了品如的衣服之后,内部居然是用了IEnumerator的各个属性与方法之间的协作。如果您喜欢设计模式的话,您可能对这些方法再熟悉不过了,它是对迭代器模式的实现。

实际操作一波

双色球摇奖大家都知道吧,就一个机器在那儿哗哗哗,然后不断摇啊,循环啊,然后吐出球来。所以我们来建立这种的可迭代情况来试试吧:

当然哈,拿双色球举例只是为了好理解。赌博有风险,你懂的( ̄▽ ̄)"

先来把双色球用我们C#的代码建立:

public class Ball
{
//球号码
public int No { get; set; }
//球颜色
public string Color { get; set; }
}

然后按照上面说的,我们是不是要让他拥有可迭代的能力,就是要让球能够拥有滚起来的能力,继承IEnumerator来实现一个可迭代的双色球迭代器对象:

public class BallEnum : IEnumerator
{
public Ball[] _ball;
int position = -1; public BallEnum(Ball[] ball)
{
_ball = ball;
} public bool MoveNext()
{
position++;
return (position < _ball.Length);
} public void Reset()
{
position = -1;
} public void Dispose()
{
throw new NotImplementedException();
} object IEnumerator.Current
{
get
{
return Current;
}
} public Ball Current
{
get
{
try
{
return _ball[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}

最后一步,给它穿上品如的衣服,将双色球包裹,促使球去滚动,这个东西是什么呢?好吧,它就是摇奖机,不用想它肯定是继承了IEnumerable

public class LotteryMachine : IEnumerable
{
private Ball[] _balls;
public LotteryMachine(Ball[] balls)
{
_balls = new Ball[balls.Length]; for (int i = 0; i < balls.Length; i++)
{
_balls[i] = balls[i];
}
} // Implementation for the GetEnumerator method.
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)GetEnumerator();
} public BallEnum GetEnumerator()
{
return new BallEnum(_balls);
}
}

写好了,来看看我们写的这个代码怎么调用:

//添加两个双色球
Ball[] balls = new Ball[2]
{
new Ball() { No = 1, Color = "bule" },
new Ball() { No = 2, Color = "red" }
}; //抬出我们的摇奖机,并把球放进去
LotteryMachine lotteryMachine = new LotteryMachine(balls); //要动起来
foreach (var ball in lotteryMachine)
{
Console.WriteLine($"{ball.Color} + {ball.No}");
}

用C#的foreach语法糖就可以迭代它啦,然后foreach in 出来的每一个对象的类型是什么样子的呢?(for循环中的ball)。

是的,它是Ball类型,那么那个BallEnum类型呢? 它隐藏起来了,我们根本看不见啦。

总结

本来这次想给大家分享.net core中的ValueTask和Task的,但是由于时间有点匆忙,素材没有收集完整,所以就只好等下次啦。

还是那句话,希望本篇文章没有花费您太多的时间。(ง •_•)ง

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator的更多相关文章

  1. 细说 C# 中的 IEnumerable和IEnumerator接口

    我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...

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

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

  3. C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield

    IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接 ...

  4. IEnumerable和IEnumerator

    概述 IEnumerable和IEnumerator接口存在的意义:用来实现迭代的功能! public interface IEnumerable { IEnumerator GetEnumerato ...

  5. 关于迭代器中IEnumerable与IEnumerator的区别

    首先是IEnumerable与IEnumerator的定义: 1.IEnumerable接口允许使用foreach循环,包含GetEnumerator()方法,可以迭代集合中的项. 2.IEnumer ...

  6. IEnumerable和IEnumerator 详解 (转)

    原文链接:http://blog.csdn.net/byondocean/article/details/6871881 参考链接:http://www.cnblogs.com/hsapphire/a ...

  7. C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)

    前言 IEnumerable.IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下.以备自己日后可以来翻查,同时也希望园子里 ...

  8. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable

    1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Re ...

  9. 转载IEnumerable与IEnumerator区别

    public interface IEnumerable {     IEnumerator GetEnumerator(); }   public interface IEnumerator {   ...

随机推荐

  1. Python--day65--Django框架介绍

    原文链接:http://www.cnblogs.com/liwenzhou/p/8296964.html 做web开发用的是MVC框架: Django框架简介 MVC框架和MTV框架(了解即可) MV ...

  2. Python--day48--ORM框架SQLAlchemy之子查询

    一定要把第一次查询的结果作为一个结果再进行查询:代码后面加.subquery()标明是子查询 1,简单的子查询 #select * from (select * from tb) as B q1 = ...

  3. 手机web页面调用手机QQ实现在线聊天的效果

    html代码如下: <a href="javascript:;" onclick="chatQQ()">QQ咨询</a> js代码如下: ...

  4. 多校 HDU - 6614 AND Minimum Spanning Tree (二进制)

    传送门 AND Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  5. sqlyog提示:没有执行查询。请在 SQL 窗口中输入查询或将光标放在一个查询上。

    以下内容纯属猜测: sqlyog 在执行输入的sql语句时,对已经执行过的语句,是不会再执行的,所以出现这个问题,很可能是sql语句没有修改,就试图执行第二遍.

  6. dotnet 手动解决 json 解析中不合法字符串

    如果使用 Newtonsoft Json 解析字符串,字符串里面有不清真的格式,那么默认的解析将会炸掉.如果想要自己解决字符串中的不清真格式,可以使用传入 JsonSerializerSettings ...

  7. Little Elephant and Array CodeForces - 220B (莫队)

    The Little Elephant loves playing with arrays. He has array a, consisting of npositive integers, ind ...

  8. 微软软件开发技术二十年回顾-.NET框架篇

    六. .NET框架篇 .NET是微软自从发布Windows 3.0以来最为激动人心的新技术,是微软战略上为下一个十年对服务器和桌面软件工程的第一步,是微软的一场世纪大豪赌.对于.NET,微软的定义是, ...

  9. koa2--07.cookies的设置和使用

    cookies本身在koa中即可直接设置和使用,不需要在安装中间件 //cookies的使用 const koa = require('koa'); var router = require('koa ...

  10. LDO

    1.出现原因:便携式设备的发展,使得人们对电源的要求越来越高,而以前一直使用的三段稳压电源无法满足需求. 2.特点:内部的PNP管导通压降很小,自耗很低. 3.应用场合: (1)不同电压输出级别的应用 ...