12.3.3 平面映射(flatteningprojection)
平面映射,可以为源集合中的每个元素,生成元素序列,合并所有返回序列。我们很快就会看到,这是定义其他处理操作,包括映射和筛选,的基本操作。平面映射所独有的特征,就是能够为每个输入元素生成多个输出元素。
注意
在 LINQ 库中,这个操作称为 SelectMany。在查询表达式中,用多个 from 子句表示。从...
分类:
其他好文 时间:
2015-01-24 11:46:10
阅读次数:
211
12.3.2.2 使用查询和序列表达式
在 C# 3.0 中,我们可以使用新的查询表达式语法,写有关映射和筛选数据的操作。查询表达式还支持许多其他操作,但我们会只关注映射和筛选,来演示函数技术和 F# 功能。
F# 虽然没有专门提供的查询表达式,但是,使用序列表达式,仍可以轻松地写出映射和筛选数据的查询。这是因为序列表达式在 F# 中所有地方都可以使用,而不仅仅是返回序列的函数。清单 1...
分类:
其他好文 时间:
2015-01-23 21:39:30
阅读次数:
290
12.3.2.1 使用高阶函数
在 F# 中,使用 Seq 模块与 List 相同,而且,我们已经知道,如何在 C# 中使用 LINQ 扩展方法。而在使用列表和序列方面,有一个显著区别:序列是延迟的。直到从返回序列中取出元素时,处理代码才执行,尽管那样,它所做的工作,也只是为了返回结果所需要的。现在,我们用简单的代码段来演示一下:
var nums1 =
n...
分类:
其他好文 时间:
2015-01-23 14:43:43
阅读次数:
118
12.3.1 用迭代器转换序列
到目前为止,我们只是用迭代器,从一段数据(如果有的话)生成序列。然而,迭代器通常用来以某种方式,进行序列的转换。作为一个简单的例子,这里有一个方法,把数字序列转换成平方序列:
IEnumerableSquares(IEnumerable numbers) {
foreach(int i in numbers)
yield return i...
分类:
其他好文 时间:
2015-01-22 18:20:34
阅读次数:
187
12.3.2 筛选和映射
最常用的序列处理运算,是筛选(filtering)和映射(projection);在第六章,我们用它们处理 F# 函数式列表,和 C# 的泛型 .NET List 类型。LINQ 库中的 Where 和 Select 扩展方法已经可以处理序列,而在 F# 中,使用Seq 模块中两个函数(即 Seq.map 和 Seq.filter),能达到相同效果。...
分类:
其他好文 时间:
2015-01-22 18:07:14
阅读次数:
148
12.3 处理序列
处理序列,可供选择的范围很广泛,包括从低级技术,能控制一切,但难以表达更复杂而通常的处理模式,到更高级技术,虽然不能表达我们所有可能想要的,但会更优雅。
在 C# 中,最低级的(除了直接实现 IEnumerable 接口)是使用迭代器块(iterator blocks),读取输入的序列,既可以使用 foreach,也可以使用枚举对象;而更高级的,我们可以使用预定义的(...
分类:
其他好文 时间:
2015-01-22 15:30:53
阅读次数:
123
12.2.2 无穷序列
在前一章,我们简单演示过使用延迟值,实现延迟列表。这种数据结构可以用来创建无穷数据结构,比如,从零开始的整数列表。这之所以可能,是因为每个元素的计算被推迟了:只在访问元素时,才计算它的值,并且,每次只关注一个元素的计算。
使用seq 表示序列是相似的。该接口有一个方法MoveNext,计算出下一个的元素。序列可能是无穷的,即,MoveNext 方法始终能够计算出下...
分类:
其他好文 时间:
2015-01-22 11:11:06
阅读次数:
263
12.2.1 递归的序列表达式
函数式编程中主要的控制流结构是递归。我们已经在很多例子中,写的普通函数就使用过递归,它能够解决命令式编程中的循环问题,而不需依赖可变状态。当我们想写一个简单的递归函数时,要使用 let rec 关键字,这样,就能函数以递归方式调用自身。
用于组合序列的 yield! 结构,也可以在序列表达式中执行递归调用,所以,我们同样可以使用函数编程的方法,生成序列。清...
分类:
其他好文 时间:
2015-01-21 16:37:06
阅读次数:
152
12.1.3.1 写序列表达式
在 C# 中,当我们实现返回 IEnumerable、IEnumerator,或对应的非泛型方法时,可以自动使用迭代器。F# 序列表达式使用 seq 标识符显式标记,而且不必要使用方法体或函数体。正如其名字所暗示的,序列表达式是表达式的不同类型,我们可以在代码中的任意位置使用。清单 12.2 演示了使用此语法,创建简单的序列。
清单 12.2 介绍序...
分类:
其他好文 时间:
2015-01-20 15:45:07
阅读次数:
175
12.1.2 在 C# 中使用迭代器
当C# 2.0 最初引入迭代器时,最常见的用途是为了使自己集合的 IEnumerable 接口的实现更简单。在 C# 中使用的编程风格已经有了演变,现在迭代器能与其它函数式结构一起使用,进行各种数据处理操作。
迭代器可以用来生成任意序列。我们先从一个简单的示例开始,生成阶乘小于一百万的序列,并格式化成字符串形式。清单 12.1 显示了完整的源代码。
...