欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

程序员文章站 2022-06-19 18:10:43
IEnumerable**和**IEnumerator**,如果不仔细看,是不是都以为它们是同样的一个单词。特别是我们习惯了每天看大量的中文,这种只是很小区别的单词更是容易犯错。在.NET的世界里好像有这种类似单词的情况还真的不少,比如**Authentication**和**Authorizati... ......

系列介绍

简介

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

场景

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

诞生缘由

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

文章质量

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

正文

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

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

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

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

先来看看它们的样子:

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

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的各个属性与方法之间的协作。如果您喜欢设计模式的话,您可能对这些方法再熟悉不过了,它是对迭代器模式的实现。

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

实际操作一波

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

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

【5min+】你怎么穿着品如的衣服?IEnumerable AND 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)。

【5min+】你怎么穿着品如的衣服?IEnumerable AND IEnumerator

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

总结

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

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