博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yeild之我理解
阅读量:5774 次
发布时间:2019-06-18

本文共 4676 字,大约阅读时间需要 15 分钟。

yield(C# 参考)

 

在块中用于向枚举数对象提供值或发出迭代结束信号。它的形式为下列之一:

class Program    {        public static IEnumerable Power(int number, int exponent)        {            int counter = 0;            int result = 1;            while (counter++ < exponent)            {                result = result * number;                yield return result;            }        }        static void Main()        {            //HelloCollection helloCollection = new HelloCollection();            //foreach (string s in helloCollection)            //{            //    Console.WriteLine(s);            //    Console.ReadLine();            //}            MusicTitles titles = new MusicTitles();            foreach (string title in titles)            {                Console.WriteLine(title);            }            Console.WriteLine();            foreach (string title in titles.Reverse())            {                Console.WriteLine(title);            }            Console.WriteLine();            foreach (string title in titles.Subset(2, 2))            {                Console.WriteLine(title);                Console.ReadLine();            }        }        }    public class HelloCollection    {        public IEnumerator
GetEnumerator() { // yield return语句返回集合的一个元素,并移动到下一个元素上;yield break可以停止迭代 yield return "Hello"; yield return "World"; } } public class MusicTitles { string[] names = { "a", "b", "c", "d" }; public IEnumerator
GetEnumerator() { for (int i = 0; i < 4; i++) { yield return names[i]; } } public IEnumerable
Reverse() { for (int i = 3; i >= 0; i--) { yield return names[i]; } } public IEnumerable
Subset(int index, int length) { for (int i = index; i < index + length; i++) { yield return names[i]; } } }

老实说我理解了啥呢,我只总觉得他可以在循环中,就是所谓的迭代器中返回值的形式,或者终止循环,不必按照规定返回集合类型

 

刚又看到一篇文章觉得有点茅塞顿开的感觉了

    yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,这个接口后续实现比较繁琐要写一大堆代码才能支持真正的遍历功能。举例说明

其实是为了让其支持遍历而设计的

using System;using System.Collections.Generic;using System.Collections;using System.Linq;using System.Text;namespace{    class Program    {        static void Main(string[] args)        {            HelloCollection helloCollection = new HelloCollection();            foreach (string s in helloCollection)            {                Console.WriteLine(s);            }            Console.ReadKey();        }    }    //public class HelloCollection : IEnumerable    //{    //    public IEnumerator GetEnumerator()    //    {    //        yield return "Hello";    //        yield return "World";    //    }    //}    public class HelloCollection : IEnumerable    {        public IEnumerator GetEnumerator()        {            Enumerator enumerator = new Enumerator(0);            return enumerator;        }        public class Enumerator : IEnumerator, IDisposable        {            private int state;            private object current;            public Enumerator(int state)            {                this.state = state;            }            public bool MoveNext()            {                switch (state)                {                    case 0:                        current = "Hello";                        state = 1;                        return true;                    case 1:                        current = "World";                        state = 2;                        return true;                    case 2:                        break;                }                return false;            }            public void Reset()            {                throw new NotSupportedException();            }            public object Current            {                get { return current; }            }            public void Dispose()            {            }        }    }}

面注释的部分引用了"yield return”,其功能相当于下面所有代码!可以看到如果不适用yield需要些很多代码来支持遍历操作。

    yield return 表示在迭代中下一个迭代时返回的数据,除此之外还有yield break, 其表示跳出迭代,为了理解二者的区别我们看下面的例子

class A : IEnumerable{    private int[] array = new int[10];    public IEnumerator GetEnumerator()    {        for (int i = 0; i < 10; i++)        {            yield return array[i];        }    }}

如果你只想让用户访问ARRAY的前8个数据,则可做如下修改.这时将会用到yield break,修改函数如下

public IEnumerator GetEnumerator(){    for (int i = 0; i < 10; i++)    {        if (i < 8)        {            yield return array[i];        }        else        {            yield break;        }    }}

 

转载地址:http://pjaux.baihongyu.com/

你可能感兴趣的文章
2018年内蒙古外贸首次突破1000亿元
查看>>
CTOR有助于BCH石墨烯技术更上一层楼
查看>>
被遗忘的CSS
查看>>
Webpack中的sourcemap以及如何在生产和开发环境中合理的设置sourcemap的类型
查看>>
做完小程序项目、老板给我加了6k薪资~
查看>>
java工程师linux命令,这篇文章就够了
查看>>
关于React生命周期的学习
查看>>
webpack雪碧图生成
查看>>
搭建智能合约开发环境Remix IDE及使用
查看>>
Spring Cloud构建微服务架构—服务消费基础
查看>>
RAC实践采坑指北
查看>>
runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用...
查看>>
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
java入门第二季--封装--什么是java中的封装
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>