系列介绍

简介

【五分钟的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. gensim的word2vec如何得出词向量(python)

    首先需要具备gensim包,然后需要一个语料库用来训练,这里用到的是skip-gram或CBOW方法,具体细节可以去查查相关资料,这两种方法大致上就是把意思相近的词映射到词空间中相近的位置. 语料库t ...

  2. [C++] 自动关闭右下角弹窗

    最近腾讯.迅雷等各种客户端,都越发喜欢在屏幕的右下角弹框了. 有骨气的人当然可以把这些软件卸载了事,但是这些客户端在某些情况下却又还是有用的.怎么办呢? 作为码农,自己实现一个自动关闭右下角弹窗的程序 ...

  3. JPA进行insert操作时会首先select吗

    在某个项目中,使用JPA的saveAll方法去批量写入数据时,通过打印sql,发现每次insert前都会先select一次,极大的浪费了写入性能. 分析一下代码,saveAll() @Transact ...

  4. tomcat access日志

    每次看access log都会记不住pattern里的各个标识代表的什么意思,记录下,备忘! tomcat的access log是由实现了org.apache.catalina.AccessLog接口 ...

  5. element-ui隐藏组件el-scrollbar

    代码如下: <div class="main_wrapper"> <el-scrollbar wrapClass="scrollar_container ...

  6. cccc初赛 L3-003 长城

    L3-009. 长城 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 邓俊辉 正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长 ...

  7. 【codeforces 749B】Parallelogram is Back

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. Python3使用过程中需要注意的点

    命名规则 变量 变量名只能是数字.字母或下划线的任意组合 变量名的第一个字符不能是数字 不能使用关键字作为变量名 变量的定义要具有可描述性 变量名不宜过长.不宜使用中文.拼音 常量(常用在配置文件中) ...

  9. yum安装错误:CRITICAL:yum.cli:Config Error: Error accessing file for config file:///home/linux/+

    上网搜了一下然后自己总结一份 : 出现原因:yum可能没有,或者损坏 解决: 第一步:下载   wget  http://yum.baseurl.org/download/3.2/yum-3.2.28 ...

  10. H3CFTP操作示例