请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

使用Yield关键字实现迭代

[复制链接]
查看3325 | 回复1 | 2018-2-10 11:37:58 | 显示全部楼层 |阅读模式
本帖最后由 飞/可爱朋 于 2018-2-10 11:59 编辑

概述:
         C#中有一个关键字“Yield”,这个关键字提供了迭代功能,你是不是没用过这个关键字呢,下面讲述一下此关键字。
Yield:
        在执行迭代时,程序将自动存储上次迭代的位置,下次迭代时从上次迭代的位置继续执行。
代码实例:
使用Yield实现的迭代方法:
[C#] 纯文本查看 复制代码
        /// <summary>
        /// 用Yield生成字符集合
        /// </summary>
        /// <param name="count">需要生成的字符个数</param>
        /// <returns>生成的字符集合</returns>
        private IEnumerable<string> CreateStrYield(int count)
        {
            //初始次数
            int index = 0;

            //循环产生字符
            while (index++ < count)
            {
                //生成字符并中断迭代返回
                yield return "Yield:" + index.ToString();
            }
        }

使用常见的For实现的迭代方法:
[C#] 纯文本查看 复制代码
        /// <summary>
        /// 用For生成字符集合
        /// </summary>
        /// <param name="count">需要生成的字符个数</param>
        /// <returns>生成的字符集合</returns>
        private List<string> CreateStrFor(int count)
        {
            //需要返回集合
            List<string> rel = new List<string>();

            //生成字符
            for (int i = 0; i < count; i++)
            {
                rel.Add("For:" + (i + 1).ToString());
            }

            //返回结果
            return rel;
        }

最后我们来测试一下两种迭代产生的结果:
[C#] 纯文本查看 复制代码
            //需要生成的字符个数
            int countStr = 5;

            //输出Yield生成的字符
            foreach (var item in CreateStrYield(countStr))
            {
                Console.WriteLine(item);
            }

            //输出For生成的字符
            foreach (var item in CreateStrFor(countStr))
            {
                Console.WriteLine(item);
            }

观察输出结果
Yield:1
Yield:2
Yield:3
Yield:4
Yield:5
For:1
For:2
For:3
For:4
For:5
两者的迭代实现了相同的功能,Yield关键字记录了迭代的位置,保证下一次迭代时候能从上一次迭代完成的位置继续执行。
使用Yield的应用场景:
eg:游戏装备的升级成功率,在1~5次的升级成功率为80%,6~8的升级成功率为50%,9~10的升级成功率为20%,大于10的概率都为10%,参见如下代码
[C#] 纯文本查看 复制代码
        /// <summary>
        /// 用Yield生成概率
        /// </summary>
        /// <returns>生成的概率集合</returns>
        private IEnumerable<float> CreateProb()
        {
            /*在1~5次的升级成功率为80%,6~8的升级成功率为50%,9~10的升级成功率为20% */

            //初始次数
            int index = 0;

            //循环产生概率
            while (index++ < 5)
            {
                //生成1~5概率
                yield return 0.8f;
            }

            //循环产生概率
            while (index++ < 9)
            {
                //生成6~8概率
                yield return 0.5f;
            }

            //循环产生概率
            while (index++ < 12)
            {
                //生成9~10概率
                yield return 0.2f;
            }

            //大于10的概率都为10%
            yield return 0.1f;
        }


看一下输出结果:
[C#] 纯文本查看 复制代码
            //输出概率
            foreach (var item in CreateProb())
            {
                Console.WriteLine(item);
            }

这是输出的结果
0.8
0.8
0.8
0.8
0.8
0.5
0.5
0.5
0.2
0.2
0.1

总结:如果你需要在一个完整的迭代中,不同的时候输出不同的且可控的结果,可以使用该关键字达到你的需求。


ibcadmin | 2018-2-10 13:50:35 | 显示全部楼层
顶~  这个研究过  复习复习
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则