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();
        }
    }
相关推荐
Zhen (Evan) Wang4 分钟前
What is the new in C#11?
开发语言·c#
IT规划师4 小时前
C#|.net core 基础 - 值传递 vs 引用传递
c#·.netcore·值传递·引用传递
__water6 小时前
『功能项目』窗口可拖拽脚本【59】
c#·unity引擎·窗口可拖拽
Aa134517650257 小时前
c#中使用sql防注入方式写入数据
数据库·sql·c#
ling1s9 小时前
C#基础(12)递归函数
开发语言·算法·c#
熊思宇9 小时前
C# 离线激活码的实现方式
c#
来一杯龙舌兰9 小时前
【JAVA】自动生成常量类、自动生成所需代码(附源码)
java·开发语言·c#·自动生成代码
看山还是山,看水还是。11 小时前
c#进度条实现方法
c语言·开发语言·笔记·c#
孑么11 小时前
C# 委托与事件 观察者模式
开发语言·unity·c#·游戏引擎·游戏程序
He BianGu12 小时前
笔记:简要介绍WPF中FormattedText是什么,主要有什么功能
笔记·c#·wpf