首页 > 编程语言 >【c#】我们为什么要用 yield return

【c#】我们为什么要用 yield return

时间:2024-10-16 14:48:08浏览次数:6  
标签:return nums c# uniqueVals List yield num

【c#】我们为什么要用 yield return

明尼苏达的微笑 明尼苏达的微笑 嗯嗯,你说的都对   43 人赞同了该文章

声明:本文部分内容来自 《more effective c#》,特此声明

c# 里面的 yield return 没什么高大上的,就是一个一个的 return。但是我们不能小看这种用法,他能给编程带来很多性能上的提高以及用法上的方便(减少遍历次数,增加重用性)。

我们来看一个例子:

对于函数

        public static List<int> Unique(IEnumerable<int> nums)
        {
            List<int> uniqueVals = new List<int>();

            foreach(int num in nums)
            {
                if(!uniqueVals.ContainsKey(num))
                {
                    uniqueVals.Add(num);
                    Console.WriteLine(num);
                }
            }
            return uniqueVals;
        }

不难理解,传进来一个数组,比如说是一个 list,返回一个去重的 list 出去,简单明了,事实上,这个函数如果不需要复用的话,没有任何问题。但是,作为程序员,我们遇到不需要复用的情形实际上是非常少的。

比方说,现在有一个要求,让你把一个去重的 list 乘方,你会怎么做,我们可能很自然的想到,把这个 Unique 函数的输出结果当做输入传到另一个乘方函数里面,然后再遍历一遍即可解决。

可是,这样的问题是,我们完全可以把去重和乘方放在一次遍历里面一起解决啊,你这样多遍历了一次,增加了时间复杂度

又有同学可能要说,我们直接去改 Unque 函数不就行了吗,再里面添加一段乘方逻辑。好,这样的话我再问你,比方说现在又有一个需求,让你把一个 list 去重以后开方,你怎么办?你是要再写一个新的函数么?这样的话,你这两个函数里面都有 list 去重这段逻辑,造成了代码冗余,这是软件工程的禁忌。

那怎么办?yield return 可以完美的解决这个问题,以上面的去重乘方需求为例,我们可以把 Unique 函数改写为:

        public static IEnumerable<int> Unique2(IEnumerable<int> nums)
        {
            List<int> uniqueVals = new List<int>();

            foreach(int num in nums)
            {
                if (!uniqueVals.ContainsKey(num))
                {
                    uniqueVals.Add(num);
                    yield return num;
                }
            }
        }

接着,我们写乘方函数,同样使用 yield return

        public static IEnumerable<int> Square(IEnumerable<int> nums)
        {
            foreach (var num in nums)
                yield return num * num;
        }

使用时,我们直接进行函数嵌套即可,我们可以通过一个 for 循环查看一下结果:

            var l = new List<int> { 0, 3, 4, 5, 7, 3, 2, 7, 8, 0 ,3, 1};
            foreach (int num in Square(Unique2(l)))
                Console.WriteLine($"{num}");

仅遍历一次,复用性良好,yield return 的好处,你现在了解了吗?

编辑于 2020-01-23 17:48

标签:return,nums,c#,uniqueVals,List,yield,num
From: https://www.cnblogs.com/sexintercourse/p/18469938

相关文章

  • 文件同步文件备份软件 Goodsync 序列号
    GoodSync是一种简单和可靠的文件备份和文件同步软件。它会自动分析、同步,并备份您的电子邮件、珍贵的家庭照片、联系人,、MP3歌曲,财务文件和其他重要文件本地-之间的台式机,笔记本电脑,服务器,外部驱动器,以及WindowsMobile设备,以及通过FTP远程,网友的WebDAV等等。该版本已内置序......
  • [Paper Reading] Decoding Surface Touch Typing from Hand-Tracking
    目录DecodingSurfaceTouchTypingfromHand-TrackingTL;DRMethodHTSkeletonSequence->TextTEXTDECODINGDATACOLLECTIONQ&AExperiment物理键盘与虚拟键盘对比对比不同MotionModel效果可视化总结与发散相关链接资料查询DecodingSurfaceTouchTypingfromHand-Tracking......
  • EasyExcel
    1、自动换行/***导出Excel,多个sheet**@paramresponseresponse*@paramfileName文件名*@paramhead表头*@paramsheetMapsheetName->数据*/publicstaticvoidexportExcelMultiSheet(HttpServletR......
  • clickhouse 备份
    此命令是在clickhouse22.7.5版本下执行:官方文档见:https://clickhouse.com/docs/en/operations/backup#command-summary参考文档: https://blog.csdn.net/lusklusklusk/article/details/139781360创建备份目录mkdir/backups/修改权限:chmod766/backups/logsudochown-Rc......
  • OS-Nachos实验环境的搭建
    实验目的:按照实验教程在本地虚拟机搭建Nachos开发环境;安装docker,下载镜像搭建基于docker的Nachos开发环境;使用./nachos–u学习nachos的用法,并对相关命令选项进行尝试;使用nachos–x选项加载test目录下编译为noff格式的用户程序运行,思考nachos执行结果错误的原因;使用gdb......
  • 敏捷转型中的敏捷实践:Leangoo领歌scrum工具私有部署解决方案
    近年来,敏捷开发逐渐成为企业项目管理中的热门话题。无论是互联网公司还是传统制造业,越来越多的企业通过敏捷方法,提升了项目的交付效率和团队的协作能力。在这个背景下,如何选择合适的敏捷管理工具,并确保其安全性和灵活性,成为了不少企业关注的焦点。 很多团队在讨论敏捷实践时,会......
  • 51单片机mcp4728驱动程序源码
    概述MCP4728有4个12位dac,无论用户需要什么电压设置。它可以将dac的设置存储到内部EEPROM中。一旦保存到内部非易失性内存中,当DAC启动时,将默认加载设置。MCP4728还允许用户在两种参考电压源之间进行选择。输入电压可以用来给V上电(CC)引脚或内部的2.048V参考电压。如果使用内部参......
  • CAE和CAD的区别
    CAE又被叫做“计算机辅助工程”,而CAD则是“计算机辅助设计”。虽然CAE和CAD是两种不同的技术,但它们却有着一定联系。在如今这个遍布科技与狠活的社会里,CAE和CAD技术在各个领域都发挥着其重要作用,下面我们一起来感受一下,CAE和CAD两种现代技术的独特魅力。首先,我们来了解一下CAD。......
  • DevEco Studio:使用模拟器运行应用
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • Curve25519
    1Curve25519对于128bit的安全级别,对于大多数的体系而言都推荐使用\(2^{255}-19\)这个素数来实现较为良好的性能。在\(2^{250}\)到\(2^{521}\)范围之间,同时满足\(2^c-s\)这个形式且\(s\)很小的素数很少,而且对于其他满足条件的素数,在性能上的表现却不尽如人意。这个素数满足\(p≡1......