Functional ProgrammingLazy Code:被我忘记的迭代器

本文给出一个Functional Programming和Lazy Code的一个例子。跟着思路走,关键的地方会有相应的说明。

我们想实现一个判断"素数"的小程序,如下:

using System;namespace FunctionalProgramming
{class Program{static void Main(string[] args){var number = int.Parse(Console.ReadLine());var result = true;for(long i=2;i<number;i++){if(number%i==0){result = false;break;}}Console.WriteLine(result);}}
}

上面的代码虽能完成功能,但不够整洁。不是我们想要的代码。
我们提取其中的方法,重新实现如下:

using System;namespace RefactorExample
{class Program{static void Main(string[] args){var number = int.Parse(Console.ReadLine());var result =  IsPrime(number);;Console.WriteLine(result);}//Refactorprivate static bool IsPrime(int number){var result=true;for (long i = 2; i < number; i++){if (number%i == 0){result = false;break;}}return result;}}
}

以此为基础,借助扩展方法,针对一个数组,我们可以方便的改写上面的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;namespace AHigherCalling
{static class Program{static void Main(string[] args){var number = new [] {3,5,7,9,11,13};foreach (var prime in number.Find(IsPrime).Take(2)){Console.WriteLine(prime);}Console.ReadKey();}private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){var result = new List<int>();foreach (var value in values){if (test(value))result.Add(value);}return result;}private static bool IsPrime(int value){var result = true;for (long i = 2; i < value; i++){if (value % i == 0){result = false;break;}}return result;}//一些其他的类似IsPrime的方法private static bool IsEven(int value){return value%2 == 0;}private static bool IsOdd(int value){return value%2 != 0;}}
}

这样做的目的是提供更清洁的语法,并提高程序应对变化的能力。例如,我们实现的两个类似IsPrime方法。

单看Find方法。貌似没有什么问题,当然我们可以用ReShaper生成LINQ语句,替换掉那个for循环。

View Code
using System;
using System.Collections.Generic;
using System.Linq;namespace AHigherCalling
{static class Program{static void Main(string[] args){var number = new [] {3,5,7,9,11,13};foreach (var prime in number.Find(IsPrime).Take(2)){Console.WriteLine(prime);}Console.ReadKey();}private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){//LINQ替换掉了for循环return values.Where(value => test(value)).ToList();}private static bool IsPrime(int value){var result = true;for (long i = 2; i < value; i++){if (value % i == 0){result = false;break;}}return result;}//一些其他的类似IsPrime的方法private static bool IsEven(int value){return value%2 == 0;}private static bool IsOdd(int value){return value%2 != 0;}}
}

程序正常运行。
貌似我们的程序没有什么问题了,那是因为我们这个数组不够大!我们把numbers变的很大!如下:

using System;
using System.Collections.Generic;
using System.Linq;namespace AHigherCalling
{static class Program{static void Main(string[] args){foreach (var prime in GetRandomNumbers().Find(IsPrime).Take(2)){Console.WriteLine(prime);}Console.ReadKey();}private static IEnumerable<int> GetRandomNumbers(){//yield return 3;//yield return 5;//yield return 7;//yield return 9;//yield return 11;//yield return 13;Random random = new Random();while (true){yield return random.Next(90000, 100000);}}private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){//LINQ替换掉了for循环return values.Where(value => test(value)).ToList();}private static bool IsPrime(int value){var result = true;for (long i = 2; i < value; i++){if (value % i == 0){result = false;break;}}return result;}//一些其他的类似IsPrime的方法private static bool IsEven(int value){return value%2 == 0;}private static bool IsOdd(int value){return value%2 != 0;}}
}

程序就也陷入死循环了!而我这次想获取的只是其前2个而已。
问题出在哪里?

不难发现,当然在Find这里!

还记得前面我实现的Find方法吗?如下:

        private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){var result = new List<int>();foreach (var value in values){if (test(value))result.Add(value);}return result;}

使用ReShaper重构过如下:

        private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){//LINQ替换掉了for循环return values.Where(value => test(value)).ToList();}

简单分析问题所在后,可以想到的解决方法,如下:

使用迭代器:

        private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){foreach (var value in values){if (test(value))yield return value;}}

或是:

        private static IEnumerable<int> Find(this IEnumerable<int> values,Func<int,bool> test ){return values.Where(value => test(value));}

这样程序就按我既定的想法运行了。

从ReShaper生成的代码来看,问题出在立即执行的ToList()那里!但毕竟ReShaper只是个工具,其翻译的是我们的代码,不推卸责任的说,问题出在我们,因为使用迭代器更正后,ReShaper不也生成了正确的代码了么?

 

 

update:

from: http://stackoverflow.com/questions/7062882/searching-a-tree-using-linq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TP框架如何绑定参数。目的进行ajax验证

TP框架的自动绑定 对于某些操作的情况&#xff08;例如模型的写入和更新方法&#xff09;&#xff0c;可以支持参数的自动绑定&#xff0c;例如&#xff1a; 首先需要开启DB_BIND_PARAM配置参数&#xff1a; DB_BIND_PARAM > true 然后&#xff0c;我们在使用 1.$Model M(U…

使用js 计算两个日期之间的相差的天数

将两个日期都转换为毫秒&#xff0c;然后相减&#xff0c;再将减下来的毫秒数转换为天数&#xff0c;就可以得到两个日期之间相差的天数了。&#xff08;接受的日期格式为“20201-1”&#xff0c;“20201/1”等用连接符连接起来的日期字符串&#xff09; getDiffDay(date_1, da…

PhpStorm配置Xdebug调试PHP程序

From: http://blog.csdn.net/ljfrocky/article/details/46531137这篇文章主要介绍了如何使用PhpStorm Xdebug调试PHP程序&#xff0c;需要的朋友可以参考下。运行环境PhpStorm版本&#xff1a;8.0.3 PHP版本&#xff1a;5.4.12 xdebug版本&#xff1a;php_xdebug-2.2.3-5.4-vc…

对刚

3 /*直接链表模拟 */ #include<cstdio> #include<iostream> #define M 100010 using namespace std; int next[M],fa[M],vis[M],n,t; int main() {//freopen("jh.in","r",stdin);//freopen("resist.in","r",stdin);//freo…

java处理高并发高负载类网站问题

java处理高并发高负载类网站问题 一&#xff1a;高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用&#xff0c;数据库的响应是首先要解决的。 一般来说MySQL是最常用的&#xff0c;可能最初是一个mysql主机&#xff0c…

动态修改el-input样式;动态修改elmentUI元素样式;css变量

场景&#xff1a;正常我们动态修改div元素的样式&#xff0c;使用:style和:class即可&#xff1b;但是我们想要动态修改element的组件样式时候&#xff0c;例如el-input字体颜色&#xff0c;由于el-input的样式嵌套很深&#xff0c;我们需要修改的实际是.el-input__inner这个样…

Listener监听器与Filter过滤器

1.Listener [1]监听器简介> Listener是JavaWeb的三大组件之一&#xff0c;Servlet、Filter、Listener> Listener翻译过来就是监听器> 现实生活中的监听器&#xff1a;- 监听谁&#xff1a;明星- 监听器&#xff1a;朝阳群众- 监听事件&#xff1a;干坏事- 回调函数&am…

【Mac】sublime text3标题栏显示文件完整路径

开发的兄弟对于sublime text一定不会陌生&#xff0c;目前在mac上使用这个软件遇到一个小问题&#xff0c;就是标题栏只显示了文件名&#xff0c;而不是文件全路径&#xff0c;所以当一个项目里同名的文件比较多的时候&#xff0c;就怕搞错文件。因此&#xff0c;我非常希望标题…

Error: listen EADDRINUSE: address already in use :::7197

vue启动项目报 Error: listen EADDRINUSE: address already in use :::7197 我是直接将项目的终端关闭&#xff0c;然后重新打开终端输入 npm run dev 就启动好了

SpringAPI手动创建代理对象——ProxyFactory

2019独角兽企业重金招聘Python工程师标准>>> 可以通过注解的方式来自定义代理对象的创建&#xff0c;同时也可以通过SpringAPI&#xff0c;手动编程的方式来创建代理对象。 几个重要的API&#xff1a; ProxyFactory\MethodInterceptor\Advice\AfterReturningAdvice\…

BZOJ2087 : [Poi2010]Sheep

一条边能连上当且仅当它没有经过任何点&#xff0c;并且两边的点都是偶数个。 枚举原点&#xff0c;通过极角排序求出哪些边是合法的&#xff0c;然后区间DP即可。 时间复杂度$O(nm\log mn^3)$。 #include<cstdio> #include<algorithm> const int N610,M20010; int…

快速学会开发微信小程序

From: https://www.cnblogs.com/juaner-hlj/p/6628148.html 1.手机&#xff08;微信-6.5.4以上&#xff09; 编辑器&#xff08;微信web开发 egret&#xff09; &#xff08;editplus sublime&#xff09; &#xff08;webstorm dw&#xff09; &#xff08;visio eclipse zen…

监听鼠标左右移动事件;所有dom事件列表

监听鼠标左右移动事件使用 mousemove 附带所有dom事件列表 <template><div><div>监听事件</div></div> </template><script> export default {data () {return {}},created () {// 定义鼠标事件处理函数document.addEventListener(…

关于Pac-Man,你所要了解的 一切

2019独角兽企业重金招聘Python工程师标准>>> 不论何时&#xff0c;它一直都是最伟大的游戏之一。这里有许多有关它的有趣的内幕&#xff1a;Pac-Man。 第一, 在一天之内重新创建Pac-Man 。 第二,对游戏种的每个鬼背后的人工智能的 一个非常详细的探讨 。 事实证明…

grunt入门 出处:http://artwl.cnblogs.com

grunt-contrib-uglify uglify是一个文件压缩插件&#xff0c;项目地址&#xff1a;https://github.com/gruntjs/grunt-contrib-uglify 本文将以一个DEMO来展示如何使用uglify插件。 DEMO环境 package.json: {"name": "grunt-demo","version": &q…

【推荐!!!】vue修改数据页面不更新;vue监听不到数据变化;vue打印有值页面无数据;this.$set ; this.$nextTick ; this.$forceUpdate

场景&#xff1a;vue是双向数据绑定的&#xff0c;那么在修改data数据时候&#xff0c;页面也应该是变化的&#xff0c;但是偶尔会遇到 1.vue修改数据页面不更新&#xff0c;既data数据变化了&#xff0c;但是页面渲染没变化。 2.或者vue监听不到数据变化&#xff1b; 3.vue打印…

探讨NDK编译错误ld.exe: Dwarf Error: mangled line number section.

如题所示的NDK编译错误是什么原因导致的&#xff1f;我的困惑今天在把WIN32下的一个工程移植到ANDROID时遇到上述错误&#xff0c;感到非常困惑。错误如下&#xff1a;D:/ndkr8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi…

Visual Studio Code之常备快捷键

From: https://blog.csdn.net/u010019717/article/details/50443970 孙广东 2015.12.31 官方快捷键大全&#xff1a;https://code.visualstudio.com/docs/customization/keybindings Visual Studio Code是个牛逼的编辑器&#xff0c;启动非常快&#xff0c;完全可以用来代替其…

jquery中cookie用法实例详解(获取,存储,删除等)

这篇文章主要介绍了jquery中cookie用法,结合实例详细分析了jQuery操作cookie的获取,存储,删除等操作,并附带了Jquery操作Cookie记录用户查询过信息实现方法,需要的朋友可以参考下本文实例讲述了jquery中cookie用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; cook…

js计算日期差;js计算天数差

场景&#xff1a;首先要注意两种情况 1.只是计算年月日的天数差&#xff0c;例如2022-10-10 12:00:00与 2022-10-11 00:00:00 相差1天 2.计算包含时分秒的天数差&#xff0c;例如2022-10-10 12:00:00与 2022-10-11 00:00:00 相差0天 3.注意safari浏览器 将时分秒的转化为时间戳…