首页 > 编程语言 >C#使用yield关键字提升迭代性能与效率

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

时间:2025-01-23 17:36:11浏览次数:1  
标签:Console 迭代 C# yield break 关键字 WriteLine

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。

完整示例代码

参考文章

作者名称:追逐时光者

作者简介:一个热爱编程、善于分享、喜欢学习、探索、尝试新事物和新技术的全栈软件工程师。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如果该篇文章对您有帮助的话,可以点一下右下角的【♥推荐♥】,希望能够持续的为大家带来好的技术文章,文中可能存在描述不正确的地方,欢迎指正或补充,不胜感激。

标签:Console,迭代,C#,yield,break,关键字,WriteLine
From: https://www.cnblogs.com/sexintercourse/p/18688241

相关文章

  • 『Python底层原理』--CPython 虚拟机
    在Python编程的世界里,我们每天都在使用python命令运行程序,但你是否曾好奇这背后究竟发生了什么?本文将初步探究CPython(Python中最流行的实现)的一些内部机制,为了更好的来理解Python语言的底层运作。1.CPython简介CPython是用**C语言**编写的Python解释器,在众多Py......
  • SaltSatck常用指令二
    #########域名管理salt.modules.dnsutilsalt'minion'dnsutil.Amsc.zhonganonline.com#从monion获取指定域名A记录salt'minion'network.pingarchlinux.orgtimeout=3systemd服务管理salt.modules.systemd_servicesalt'minion'service.disa......
  • 替代saveBatch
    publicBooleanextendDetailUser(SalaryAccountingItemParamparam){//获取上期已选人员关联的项目List<SalaryAccountingItemDetailUser>extendDetailUserList=this.list(Wrappers.<SalaryAccountingItemDetailUser>lambdaQuery().eq(S......
  • K8S静态PV&PVC配置
    持久卷与动态存储NFS-PVC-PV实战案例1、创建后端存储NFS节点[root@web04~]#mkdir-pv/kubelet/pv/pv00{1..3}mkdir:createddirectory‘/kubelet/pv’mkdir:createddirectory‘/kubelet/pv/pv001’mkdir:createddirectory‘/kubelet/pv/pv002’mkdir:created......
  • pycharm导入Python解释器错误解决
     1.Pycharm中显示PleaseselectavalidPythonInterpreterhttps://blog.csdn.net/hou09tian/article/details/120900335 _________________________________________________________________________________________________________________ 1、新建环境出现问题的......
  • Flink(十一): DataStream API (八) Checkpointing
    1. CheckpointingFlink容错机制的核心部分是对分布式数据流和操作符状态绘制一致的快照。这些快照作为一致的检查点,系统可以在发生故障时回退到这些检查点。Flink绘制这些快照的机制在分布式数据流的轻量级异步快照中有详细描述。该机制受标准的Chandy-Lamport算法启发,专......
  • h5使用better scroll实现左右列表联动
      展示效果安装vant^2.12.38和better-scroll^2.5.1<template><div><divclass="dept-filter"@click="showFilter"><divclass="name">{{params.name}}</div><imgclass="img......
  • 在使用prism的region跳转时,出现The region manager does not contain the MainViewReg
    在做新项目时,把原来的旧项目拷过来进行重构,上一个项目进行region填充是没有问题的,这次再次进行测试出现了这样的问题,于是在网上寻找答案。错误给出来的很明显,regionManager没有一个叫做MainViewRegionName的区域,想当然的就手动添加,进行刷新,这种方法参考Prism区域异常问题分析(......
  • Web安全:缓存欺骗攻击;基于缓存、CDN的新型Web漏洞
    基于缓存、CDN的新型Web漏洞漏洞原理利用方式解决方法Web缓存欺骗漏洞(WebCacheDeception)是一种利用不安全的缓存机制来泄露用户敏感信息的攻击方式。攻击者通过操控请求URL诱导缓存系统将敏感信息缓存并对其他用户公开,可能导致用户数据泄露等严重问题。漏洞原理......
  • C++模板全解析:场景与注意点揭秘!
    C++作为现代编程语言中的一种,其强大功能和复杂性使得它在系统编程、应用开发等领域广受欢迎。其中,模板(Template)是C++语言中一个极为重要且强大的特性,它不仅提高了代码的复用性,还使得类型无关的编程成为可能。本文将详细介绍C++模板的基础知识,包括其概念、分类、常见应用场景及......