C#使用yield关键字实现提升迭代性能与效率

 更新时间:2025年01月22日 08:22:16   作者:追逐时光者  
yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴趣的可以了解下

前言

yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,减少了内存占用,并允许在迭代时执行复杂逻辑。

传统迭代和yield迭代方式对比

咱们来看看传统迭代方式和yield关键字迭代方式对比,是否如传说中的代码实现起来更简洁和高效:

        /// <summary>
        /// 传统迭代方式和yield关键字迭代方式对比
        /// </summary>
        public static void IteratorComparisonRun()
        {
            Console.WriteLine("迭代器方法使用yield关键字:");
            foreach (var number in GetNumbersWithYield())
            {
                Console.WriteLine(number);
            }

            Console.WriteLine("传统迭代方法返回一个List<int>");
            var numbers = GetNumbersWithoutYield();
            foreach (var number in numbers)
            {
                Console.WriteLine(number);
            }
        }

        /// <summary>
        /// 迭代器方法使用yield关键字
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<int> GetNumbersWithYield()
        {
            for (int i = 0; i < 6; i++)
            {
                yield return i;
            }
        }

        /// <summary>
        /// 传统迭代方法返回一个List<int>
        /// </summary>
        /// <returns></returns>
        public static List<int> GetNumbersWithoutYield()
        {
            var numbers = new List<int>();
            for (int i = 0; i < 6; i++)
            {
                numbers.Add(i);
            }
            return numbers;
        }

输出结果:

yield延迟加载按需获取数据

yield关键字可以通过延迟执行的方式,仅在实际需要时生成数据,从而提高了性能和效率。

        /// <summary>
        /// yield关键字延迟加载按需获取数据
        /// </summary>
        public static void LazyLoadingRun()
        {
            Console.WriteLine("yield延迟加载按需获取数据 开始...");

            foreach (var number in GetEvenNumbers(11))
            {
                Console.WriteLine($"返回值 === {number} ===");
                Thread.Sleep(500);
            }

            Console.WriteLine("yield延迟加载按需获取数据 结束...");
        }

        /// <summary>
        /// 使用yield返回偶数的迭代器方法
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<int> GetEvenNumbers(int number)
        {
            for (int i = 1; i < number; i++)
            {
                Console.WriteLine($"Yielding {i}");
                if (i % 2 == 0)
                {
                    yield return i; //只在需要时生成偶数
                }
            }
        }

输出结果:

yield break显式示迭代结束

yield break:显式示迭代结束,如以下示例所示:

        public static void YieldBreakRun()
        {
            Console.WriteLine(string.Join(" ", TakeWhilePositive(new int[] { 1, 3, 4, 5, -1, 3, 4 })));
            //输出:1 3 4 5

            Console.WriteLine(string.Join(" ", TakeWhilePositive(new int[] { 9, 8, 7, 6, 5, -5, 88, 100 })));
            //输出:9 8 7 6 5
        }

        public static IEnumerable<int> TakeWhilePositive(IEnumerable<int> numbers)
        {
            foreach (int n in numbers)
            {
                if (n > 0)
                {
                    yield return n;
                }
                else
                {
                    yield break;
                }
            }
        }

什么情况不能使用yield关键字

带有 in、ref 或 out 参数的方法。

Lambda 表达式和匿名方法。

在 C# 13 之前,yield 在具有 unsafe 块的任何方法中都无效。从 C# 13 开始,可以在包含 unsafe 块的方法中使用 yield,但不能在 unsafe 块中使用。

不能在catch和finally块中使用yield return和yield break。

不能在具有catch块的try块中使用yield return和yield break。

可以在只有finally块的try块中使用yield return和yield break。

到此这篇关于C#使用yield关键字实现提升迭代性能与效率的文章就介绍到这了,更多相关C# yield关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#可变参数params示例详解

    C#可变参数params示例详解

    params是c#的一个关键字,用用汉语来说的话叫可变参数,这里的可变,不是说的类型可变,而是指的个数可变,这是c#的一个基础关键字,相信大家都有一定的了解,本篇文章就来大致的说一下C#可变参数params
    2022-02-02
  • C#接口(Interface)用法分析

    C#接口(Interface)用法分析

    这篇文章主要介绍了C#接口(Interface)用法,较为详细的分析了C#中接口的功能、实现及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C# wpf 实现窗口任意区域点击拖动

    C# wpf 实现窗口任意区域点击拖动

    在wpf要实现此功能简单形式还是比较容易的,但是有一些细节需要专门处理,比如与按钮的点击事件冲突问题,解决事件冲突问题后拖动的灵敏度,可复用性等,这篇文章主要介绍了C# wpf 实现窗口任意区域点击拖动,需要的朋友可以参考下
    2024-03-03
  • C# BinaryReader实现读取二进制文件

    C# BinaryReader实现读取二进制文件

    在 C# 以二进制形式读取数据时使用的是 BinaryReader 类。本文介绍了C# BinaryReader实现读取二进制文件,感兴趣的可以了解一下
    2021-06-06
  • C#中DateTime的格式符的实现示例

    C#中DateTime的格式符的实现示例

    本文介绍了C#中DateTime格式符的使用方法,分为预定义格式和自定义格式两类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • C#借助Spire.Doc实现Word表格自动排版

    C#借助Spire.Doc实现Word表格自动排版

    在日常开发中,利用C#自动化生成Word报告是一项常见需求,本文将介绍使用 Spire.Doc for .NET 组件,通过C#代码精确设置 C# Word 表格列宽,希望对大家有所帮助
    2026-02-02
  • C#表达式树(Expression Trees)的使用

    C#表达式树(Expression Trees)的使用

    本文主要介绍了C#表达式树(Expression Trees)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • MessageBox的Buttons和三级联动效果

    MessageBox的Buttons和三级联动效果

    这篇文章主要介绍了MessageBox的Buttons和三级联动的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • C#中ref关键字的用法

    C#中ref关键字的用法

    这篇文章介绍了C#中ref关键字的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#实现压缩图片为可控制的JPEG格式

    C#实现压缩图片为可控制的JPEG格式

    这篇文章主要为大家详细介绍了使用C#实现将图片压缩为质量可自己控制的JPEG的几种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2024-01-01

最新评论