C#迭代器方法和yield用法

一.迭代器方法介绍

可使用foreach循环进行遍历的方法,称为迭代器方法。

迭代器方法使用yield return语句返回元素。 到达yield return语句时,会记住当前在代码中的位置。 下次调用迭代器函数时,将从该位置开始执行。换言之,如果语句中出现yield关键字,则意味着它出现的方法是迭代器方法。

在以下示例中,foreach 循环的首次迭代使 SomeNumbers 迭代器方法执行,直至到达第一个 yield return 语句。 此迭代返回的值为 3,并保留当前在迭代器方法中的位置。 在循环的下次迭代中,迭代器方法的执行将从其暂停的位置继续,直至到达 yield return 语句后才会停止。 此迭代返回的值为 5,并再次保留当前在迭代器方法中的位置。 到达迭代器方法的结尾时,循环完成。

cs 复制代码
    class MainClass
    {
        public static IEnumerable SomeNumbers()
        {
            yield return 3;
            yield return 5;
            yield return 8;
        }
        static void Main()
        {
            foreach (int number in SomeNumbers())
            {
                Console.Write(number.ToString() + " ");
            }
        }
    }
    /* Output:
       3 5 8
    */

迭代器方法的返回类型必须为IEnumerable,IEnumerator,IEnumerable<T>或IEnumerator<T>。可以使用yield break语句来终止迭代。

在迭代器方法中除了yield return外,不允许出现普通的return语句。

二.通过迭代器方法快速创建迭代器

在下例中,如果不使用yield return语法,则需创建一个类实现IEnumerator接口,实现MoveNext、Current和reset方法。可见yield是一种语法糖,简化了创建迭代器的复杂性。

cs 复制代码
    public class DaysOfTheWeek : IEnumerable
    {
        private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        public IEnumerator GetEnumerator()
        {
            for (int index = 0; index < days.Length; index++)
            {
                // Yield each day of the week.
                yield return days[index];
            }
        }
    }
    class MainClass
    {
        static void Main()
        {
            DaysOfTheWeek days = new DaysOfTheWeek();

            foreach (string day in days)
            {
                Console.Write(day + " ");
            }
            // Output: Sun Mon Tue Wed Thu Fri Sat
            Console.ReadKey();
        }
    }
相关推荐
波力海苔夹心脆6753 小时前
VisionMaster 两级位置修正实战:塑料外壳与金属件装配角度检测
经验分享·计算机视觉·c#·visionmaster·海康机器人·位置修正
小羊没烦恼!4 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
淡海水6 小时前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc
信可维6 小时前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
半摆烂日常8 小时前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#
绛橘色的日落(。・∀・)ノ8 小时前
C#学习笔记
笔记·学习·c#
asdzx679 小时前
C# 将 HTML 转换为 PDF:基于 Chrome 的转换方案
pdf·c#·html
1-1=010 小时前
.NET 实现后台任务
c#·.net·.netcore·quartz·hangfire
步步为营DotNet10 小时前
从分代预算到 DATAS:.NET GC 调优到底在调什么
c#·.net·内存管理·gc·datas
淡海水10 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc