过了许久的时间,终于趁闲暇的时间来继续将函数式编程这个专辑连载下去,这段时间开头是为IOS这个新方向做准备,将OC的教程写成了SWIFT版,当然我个人是支持Xamarin,但是我一般会先掌握原生态的开发,再掌握Xamarin。后面剩下的时间开发了一个Xamarin App项目,用了十几天完成的。今天的内容将对比较简单,就是讲述如何利用函数式编程来实现列表推导。说的简单点就是列表的数据并不像我们平时开发那样实现写好的,而是通过一定的算法计算出来的(不是程序一打开就计算完成的,而是在使用的时候才计算的,并且只计算到我们使用的那一项为止)。

用函数方法实现迭代器

首先我们当然是先编写一个高阶函数来实现列表推导的主要功能部分,具体的代码如下所示:

 1         public static IEnumerable<T> Sequence<T>(Func<T, T> getNext, T startVal, Func<T, bool> endReached)
 2         {
 3             if (getNext == null)
 4                 yield break;
 5             yield return startVal;
 6             T val = startVal;
 7             while (endReached == null || !endReached(val))
 8             {
 9                 val = getNext(val);
10                 yield return val;
11             }
12         }

这个函数的作用就是根据一定的算法进行迭代,而这里利用了C# 2.0才有的语法。该函数首先是根据startVal开始迭代,并且根据getNext计算下一个值,而endReached则用来约束结束条件。所以我们可以看到如果endReached为NULL也是可行的,这样这个序列就是无穷的,当然不是死循环。下面我们利用一段简单的代码来掩饰如何使用这个函数:

        static void Main(string[] args){var oddNumbersForm1 = Sequence<int>(x => x + 2, 1, x => x >= 20);foreach (int x in oddNumbersForm1){Console.WriteLine(x);}Console.ReadKey();}

最后我们在命令行界面中可以看到如下的显示:

值域

很多时候我们使用的序列都是很简单的,而利用上面的Sqquence函数则会变得复杂,同时这个函数还无法实现一些我们需要的功能,比如需要判断一个值时候存在范围中等等,所以我们下面将利用一个简单的Range来实现这些功能,当然内部还是使用的如上的Sequence函数,下面是具体的代码:

 1         public class Range<T> : IEnumerable<T>
 2         {
 3             private T start;
 4             private T end;
 5             private Comparison<T> compare;
 6             private IEnumerable<T> sequence;
 7
 8             private static int Compare<U>(U one,U other)
 9             {
10                 return Comparer<U>.Default.Compare(one,other);
11             }
12
13             public Range(T start, T end, Func<T, T> getNext, Comparison<T> compare)
14             {
15                 this.start = start;
16                 this.end = end;
17                 this.compare = compare;
18                 this.sequence = Sequence<T>(getNext, start, v => compare(getNext(v), end) > 0);
19             }
20
21             public Range(T start, T end, Func<T, T> getNext)
22                 : this(start, end, getNext, Compare) { }
23
24             public IEnumerator<T> GetEnumerator()
25             {
26                 return sequence.GetEnumerator();
27             }
28
29             System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
30             {
31                 return ((IEnumerable<T>)this).GetEnumerator();
32             }
33
34             public bool Contains(T value)
35             {
36                 return compare(value, start) >= 0 && compare(end, value) >= 0;
37             }
38         }

通过上面的代码我们可以看到Range的功能远远比Sequence函数要强大的多,并且我们可以看到我们还提供了Contains方法用来判断指定的值是否在值域中,另外我们还可以获得IEnumerable借口的各种扩展方法供我们使用。

限制

有时我们的迭代器的实现可能很复杂,如果还要加上限制不仅仅会影响到其性能,同时还会导致代码的可读性较差,所以我们可以将这两者进行分离,负责生成序列的函数只需要没有任何限制,而将限制移转到外部,比如函数TFunc是一个返回序列的函数,并且没有限制,而CFunc则接受一个最大值,以及用来计算序列的函数,并且返回负责条件的序列,那么我们就可以像如下这样循环获取值:

1 foreach(int x in CFunc(10,TFunc)){
2     Console.WriteLine(x);
3 }

至此关于函数式编程中的序列就结束了,后面的时间笔者将会抓紧时间尽快将这个专辑结束掉,开始集中在Xamarin.Android这个系列的教程上。

转载于:https://www.cnblogs.com/yaozhenfa/p/functional_list.html

C#函数式编程之序列相关推荐

  1. java8 函数式编程_如何使用Java 8函数式编程生成字母序列

    java8 函数式编程 我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC ...

  2. 如何使用Java 8函数式编程生成字母序列

    我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC, ..., ZZ. 可 ...

  3. 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他...

    函数式编程 Lambda exec,eval和assert语句,repr函数 lambda语句 用来创建简短的单行匿名函数 print_assign = lambda name, value: nam ...

  4. 写 Python 代码不可不知的函数式编程技术

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|深度学习这件小事 本文对 Python 中的函数式编程技 ...

  5. Python 过程式编程与函数式编程

    过程式与函数式是两种截然不同的编程方式和思考方法,下面以求解素数为例做一下对比. 采用过程式编程 def isPrime(n):mid = int(pow(n,0.5)+1)for i in xran ...

  6. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国

    学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...

  7. 优化函数式编程:向 PHP 移植 Clojure 函数

    许多通用程序设计语言试图兼容大多数编程范式,PHP 就属于其中之一.不论你想要成熟的面向对象的程序设计,还是程序式或函数式编程,PHP 都可以做到.但我们不禁要问,PHP 擅长函数式编程吗?本文系国内 ...

  8. Python进阶【第五篇】函数式编程及某些特殊函数

    一.函数式编程--Functional Programming 函数式=编程语言定义的函数+数学意义的函数 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语 ...

  9. Python 进阶_函数式编程

    目录 目录 函数式编程 Python 函数式编程的特点 高阶函数 匿名函数 lambda 函数式编程相关的内置函数 filter 序列对象过滤器 map reduce 折叠 自定义的排序函数 最后 函 ...

最新文章

  1. Microsoft Security Essentials 4.1.522.0 RTM
  2. 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割
  3. numpy 笔记:改变形态
  4. 微软XAML Studio - WPF, UWP, Xamarin等技术开发者的福音
  5. Neo4j fails creating index,创建索引失败
  6. MONGODB-CR credentials missing in the user document的解决办法
  7. 【HDOJ6957】Maximal submatrix(单调栈,最大子矩阵面积)
  8. [转载] python如何删除对象属性_Python3基础 delattr 删除对象的属性
  9. Handler机制的理解与使用
  10. 工作学习总结--ng2-pdf-viewer的运用
  11. ad20中如何在pcb里查找器件,AD中原理图如何查找相应的元件?
  12. 分数化简java_中国MOOC分数——Java
  13. 兜兜转转 - 2019开启CSDN博客的新篇章
  14. 2009年 上海证券交易所新一代交易系统有多牛逼
  15. Linux Ubuntu输入法安装设置及中文字体安装
  16. 剑指Offer 09.用两个栈实现队列(LIFO与FIFO)
  17. 路由器把服务器的地址修改,路由器修改服务器地址
  18. 隐藏身份证中间几位工具类
  19. 【基础版】大学计算机-计算思维导论
  20. shp文件中polyline是什么_shp文件的读取

热门文章

  1. 解决PyInstaller打包程序exe在win7运行异常问题(OSError: [WinError 87] 参数错误、Error loading Python DLL python39.dll等)
  2. 深度神经网络可解释性:卷积核、权重和激活可视化(pytorch+tensorboard)
  3. LeetCode —— 146. LRU缓存机制(Python)
  4. Pytorch —— 模型保存与加载
  5. 九九乘法表下半三角(C语言)
  6. python单自由度振动计算-数据可视化2
  7. tensorflow第十一步CNN表情识别
  8. “源文件与模块生成时的文件不同,是否希望调试器使用它?”解决方案
  9. Apache Shiro入门
  10. 运维常用进程查看命令