• C# 中的"yield"使用


    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] {1, 1, 2, 3, 4, 5, 6, 7, 87, 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;
            }
        }
    }
    复制代码

        这样,则只会返回前8个数据.

  • 相关阅读:
    需求调研-用户访谈
    kettle监控销售人员当月每天任务完成率_20161107周一
    MySQL学习_计算用户支付方式占比_20161104
    MySQL 数据底部出现总计字样 第二种办法 纵向合并 20161103
    MySQL 单笔订单满6个及以上产品且金额>=300赠送优惠券_20161103
    MySQL学习_查看各仓库产品的销售情况_20161102
    MySQL与EXCEL sum sumif sumifs 函数结合_品牌汇总_20161101
    MySQL_活动期间单笔订单最高的且满600元 判别是重激活客户还是10月注册客户_20161031
    MySQL活动期间订单满600元并且在活动日期之前超过30天没有下过单_20161030
    MySQL活动期间制定月份注册用户下单情况_20161029
  • 原文地址:https://www.cnblogs.com/soundcode/p/11449249.html
Copyright © 2020-2023  润新知