一个C#中的例子——lambda表达式

我们多次提到,当前来说,Web开发领域,开发工具(或者叫平台)的“三巨头”是 .Net、JAVA和PHP。如果用.Net,那么一般用C#语言(或者VB),在C#语言3.0版中,引入了一个非常重要的新特性称为“lambda表 达式”。首先来普及一下“lambda表达式”的概念和作用。lambda 是一个希腊字母“λ”的英文读音,我们中国人一般念作“拉姆达”。

首先,在C#中,可以用 lambda表达式来定义一个匿名的函数。例如

x => x%2==0

就定义了一个匿名的函数,这个函数的作用是判断一个参数是不是偶数。其中 “=>” 是C#中用用于定义lambda表达式的运算符,他前面的x是函数的输入参数,他后面是返回的结果,当x是偶数,即x除以2的余数等于0时返回true, 否则返回false。那么定义了这么一个lambda表达式有什么用呢?还是看一个例子。

比如说,有一个一维数组,保存着若干整数,现在需要计算出其中大于0的个数。那么按照传统方法可以这么写:

int c=0;
foreach(int i in numbers)
{
if(i>0) c++;
}

而如果在C#3.0中,使用 lambda表达式,代码就可以缩减到这样一个语句:

int c = numbers.Count(x => x>0 );

其中,Count() 是数组类型的一个方法,它的参数是一个lambda表达式,通过这个lambda表达式可以过滤参加统计的元素,就是说,只有大于零的元素才进行统计,这样,一句话就可以非常清晰地完成了上面的任务。

而这仅仅还是一个非常简单的要求,如果是这个例子的要求更复杂一些:“将一个整数数组中的所有正数选出来,各自求出其平方,然后按大小排序,构造出 一个新的数组”。那么这段程序可就需要做不少事情了,首先要对数组中的所有元素进行过滤,筛出大于0的数,然后每个数求出他的平方,然后对他们进行排序, 并且要构造一个新数组并填充结果。而在C#3.0中,通用可以使用一个语句完成上面的任务:

int[] n = numbers.Where(x => x>0 ).Select(x=>x*x).Orderby(x=>x).ToArray();

可以看到,上面的语句中,出现了3次 lambda表达式。Where、Select、Orderby这个三个方法调用,分别实现了过滤、平方、排序,他们都是以 lambda表达式作为参数传递到方法中,可见它的灵活和方便。

lambda表达式的数学来历

我 们看到了lambda表达式的作用,很容易我们会想到,为什么他们叫做“lambda”表达式这个“奇怪”的名字呢?实际上,这就倒回去80年了,在计算 机还处于“纸上谈兵”的年代,20世纪30年代,美国数学家阿隆佐.丘奇(Alonzo Church, 1903 – 1995)给出了一套用于研究函数定义和应用的形式系统,称为”λ演算“(lambda calculus)。

如果没有学习过相关内容,要完整地理解 lambda 演算,并不是很容易的一件事。这里给出一个最简单的例子,在 lambda 演算中,每个表达式都代表一个只有单独参数的函数,这个函数的参数本身也是一个只有单一参数的函数,同时,函数的值是又一个只有单一参数的函数。函数是通 过 lambda 表达式匿名地定义的,这个表达式说明了此函数将对其参数进行什么操作。

例如,一个函数 f(x) = x + 2 ,这是我们都很熟悉的书写方式,表示自变量(参数)为x,函数的值为“x+2”。如果用 lambda 演算表示,他的形式就变为了: λ x. x + 2。这里λ是一个固定的符号,后面的x表示参数,圆点后面表示函数的值是x+2,而 f(3) 的值写作 (λ x. x + 2) 3。更多的 lambda 表达式 相关的内容,这里不再介绍,可以参考wiki百科中相关的介绍。

那么如果仅仅是这么性形式上更换一个写法,当然也就没有什么实际意义了,而这么做的巨大意义在于,基于这样一套非常简明的规则,可以把“计算”这件事说清楚,即什么是可以计算的,以及如何使用通用的方式描述一个“计算”的过程?

就好象CSS为了描述页面布局,而设计出一套“盒子模型”,它是把页面布局中的最通用、最基本的一些特征提取出来,形成的若干规则。同样,”λ演算“是一套“计算的模型”,它是对计算的本质特征的描述。 lambda 演算与现代的计算机之间,还看不出直接的联系。而到了阿隆佐.丘奇的学生阿兰.图灵(Alan Turing)的时候,就把二者直接关联起来了。

 图灵机(英语:Turing Machine,又称确定型图灵机)是英国数学家阿兰·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。

也就是说,图灵“从理论上”设计出了现代的计算机,并给出了计算机的具体运行方式。而这个运行在“纸面上”的计算机,仅仅用几行文字就可以描述清 楚。在图灵发表了他的关于图灵机的理论十年之后,真正的计算机被真正制造出来。直到今天,我们使用的计算机,本质上看,不管你用的是“奔腾”还是“酷 睿”,仍然都是在在图灵机的模型上建立的,这就是数学的力量。人类的最重要的思维能力之一是“抽象”的能力,牛顿从苹果落地“抽象”出万有引力定律,图灵 从千变万化的计算中“抽象”出图灵机,包括CSS的设计者从页面布局中“抽象”出合资模型,本质都一样的,就是从纷繁复杂的表象之中,看到了隐藏在现象背 后的本质的规律。

由此,我们可以看到,数学的作用,正是从纷繁复杂的现象中寻找事物最本质的规律。

至于Lambda表达式,C#中引入并不算早的,在它之前,就已经有很多现代的编程语言中都实现了Lambda表达式。更为重要的是,我们当前进行开发,大多使用的C语言为代表这类过程性语言,实际上,还有一大类编程语言,与之区别甚大,称为“函数式语言”。

比如现在很热门的Erlang,以及很古老的Lisp,在国外大学教学中非常流行的SCHEME,甚至微软都已经推出了自己的函数语言F#。而全世界的第一个函数语言,就是这个并非为计算机设计的”λ演算“。 实际上,在计算机高级语言出现之初,函数语言和过程性的语言是同时开始的,但是几十年来的普及程度,过程性语言远远超过了函数式语言,具体原因大概是函数 语言并没有过程性语言方便。但是世道就是这样有趣,随着计算机硬件的发展,现在多核CPU的出现和普及,并行计算的要求越来越高,又使得函数式语言的优势 大大增加,从而使函数式语言大为热门。所以,研究历史、对比当前,发现到问题的本质,实在是很有趣的一件事。

如果对编程语言感兴趣,可以参考《编程语言的入门科普》和《编程语言分类学》。

再看C#中的lambda表达式

上面我们了解了C#新引入的“lambda表达式”这个特性,以及他的来历和数学基础,也简单演示了一下在C#中使用“lambda表达式”的作 用,但是如果仅仅是为了节省几个循环语句,是代码简洁一些,就太小看了“lambda表达式”的作用。实际上微软引入“lambda表达式”的意义远不止 于此,还有更大作用,这里就不再深入研究了。

写过一些程序的,比如用C语言或者C++、C#语言的读者有没有考虑过一个问题,尽管我们在程序中计算一个表达式的值很容易,比如这样一句话:

int x=3*(2+3);

就给x这个变量赋值为15了。

但是如果要您写一个程序,实现用户输入一个数学表达式的字符串,然后计算出结果,可就不那么容易了。写一个能够计算加减乘除、带有括号的四则运算的 程序,至少要在计算机系学到3年级的《编译原理》课程,才够用的。为什么呢?因为里面包含了很复杂的逻辑的,比如你需要能够把一个字符串,解析为运算的操 作数和运算符号,同时还要考虑,先乘除后加减的规则,以及括号的处理。若你可以没有学习任何相关基础的情况下,自己能够成功地写出这样一个程序,说明你绝 对是个非常非常聪明的人。

理论上说,计算机程序中包括两个部分:“数据”和“指令”,当我们把一个四则运算的表达式存储在字符串中的时候,它仅仅是一些数据,而不是指令,要真正计算出结果,需要把这个数据转换成指令,才能够进行计算。

因此,如果从更深层次看待这个问题的话,C#引入“lambda表达式”、以及“表达式树”这几个新特性以后,从基础层面,在“数据”和“指令”之 间搭建了一座桥梁,可以非常方便地相互转化。当一个表达式的逻辑通过“表达式数”以数据的形式保存以后,就可以方便地对他进行各种操作。具体内容这里不再 详细讨论。

当 然这方面还有很多工作可做。实际上,由Anders Hejlsberg主持的C#语言从1.0到即将发布的4.0,一直保持着相当快速的的前进步伐,C# 1.0实现了代码的托管,C# 2.0实现了泛型,C# 3.0引入了LINQ,C# 4.0将引入动态特性。一步一个脚印,而且每一个新特性都为后面的发展打下了坚实基础。

总而言之

在上面,我们结合C#语言中的一个特性,说明了一下它背后的数学背景。可以看出以下的一些结论,希望对读者有所帮助:

计算机科学的本质是数学

计算机成为一种科学,其实历史很短,不过几十年的时间。尽管现在的计算机已经成了日常消费品,而当初计算机科学的先驱们可都是大数学家。当然现在计 算机以及软件开发已经成为了一个巨大的产业,很多很多工作,都不需要数学家才能胜任了。否则,依靠着几个数学家,这么多事情可做不过来啊。

但是有一点我们要认清的是,越是重要的、底层的、基础性的工作,和数学的关系越密切。因此,我们作为普通人,可以看看自己的能力到哪层,就去寻找适合子的工作。

软件开发人员要学到什么程度才够用呢?

就像上面我提到的,现在整个产业已经变得巨大无比,因此层次也非常多,已经不存在一个明确的界限了,无论你有的基础如何,总是可以找到适当的位置 的。当然,如果你希望做一个程序员,数学还是一个需要重要因素的。做程序的人数学不好,就好象唱歌不认识乐谱,或者绘画不懂素描,对你的影响是很大的,

至于应该如何学习数学?我的感觉是: 1)先侧重于“广度”,2)然后再有重点地考虑“深度”,3)最重要的是提高学习能力。

第一句话的意思是:先侧重于“广度”的意思是,你先不管能理解多少,至少把那写必备的基础,都略知一二,即使不是真懂,至少也要知道一些重要的概念、大原则、大的思考方法。

第二句话的意思是:然后再考虑“深度”的意思是,在大致了解的基础上,在找一些相对直接有用的,深入地学习。

第三句话的意思是:任何人都不可能什么都掌握,很多东西都是在用到的时候,才会去具体研究学习,因此学习能力才是最重要的。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
清晰完整PDF版本,是我从网上买来的 共 60MB,分为11个分卷 在 CSDN 上只有我整个是清晰完整的 LINQ 实战 1/11 LINQ 实战 .NET 2010 SQL 出版社:人民邮电出版社 ISBN:9787115208514 原价:65元 作者:(法)马格里,(美)艾歇特,(美)伍利 著,陈黎夫 译 出版日期:2009-8-1 字数:668000 页码:416 内容提要 -------------------------------------------------------------------------------- 作为.NET上连接编程语言和数据库、内存对象、XML等各种类型数据之间的桥梁,LINQ引入了一种处理数据的全新理念,将查询无缝集成至开发语言之上。本书第一部分介绍了LINQ技术及C#和VB为此提供的新语言特性,第二、三、四部分详细介绍了LINQ的三大主要功能LINQ to Objects、LINQ to SQL、LINQ to XML,第五部分研究了LINQ的可扩展性、在应用程序使用各种LINQ功能的方法以及LINQ to DataSet。   本书适合于使用C#和VB.NET的软件开发者。 编辑推荐 -------------------------------------------------------------------------------- 微软MVP呕心沥血之作,LINQ圣经,深入全面,引人入胜,丰富实例,兼顾C#和VB.NET语言。   本书作者是LINQ社区的重要成员,他们在书展示了这一技术的精髓……快去享受这一盛宴吧。          ——Matt Warren,微软主架构师,LINQ之父   LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!         ——Patrick Smacchia,微软MVP,《C#和.NET 2.0 实战》作者 目录 -------------------------------------------------------------------------------- 第一部分 从这里开始 第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 1.3 LINQ的设计目标及起源 13 1.3.1 LINQ项目的设计目标 13 1.3.2 一点历史 14 1.4 LINQ to Objects初步:查询内存的集合 15 1.4.1 先决条件 15 1.4.2 Hello LINQ to Objects 17 1.5 LINQ to XML初步:查询XML文档 20 1.5.1 为什么需要LINQ to XML 20 1.5.2 Hello LINQ to XML 22 1.6 LINQ to SQL初步:查询关系型数据库 26 1.6.1 LINQ to SQL功能概览 26 1.6.2 Hello LINQ to SQL 26 1.6.3 进一步了解LINQ to SQL 30 1.7 小结 30 第2章 C#和VB语言的增强特性 31 2.1 新语言的增强特性一瞥 31 2.1.1 列出当前正在运行的所有进程 32 2.1.2 将返回结果封装成类 33 2.2 隐式类型局部变量 34 2.2.1 语法 35 2.2.2 使用隐式类型局部变量改进实例程序 35 2.3 对象和集合的初始化器 37 2.3.1 引入对象初始化器的动机 37 2.3.2 集合初始化器 38 2.3.3 用对象初始化器改进实例程序 39 2.4 Lambda表达式 40 2.4.1 委托回顾 40 2.4.2 匿名方法 42 2.4.3 Lambda表达式介绍 42 2.5 扩展方法 47 2.5.1 创建扩展方法的示例 47 2.5.2 更多使用LINQ标准查询操作符的例子 50 2.5.3 将扩展方法引入到实例程序 51 2.5.4 注意事项 52 2.6 匿名类型 54 2.6.1 使用匿名类型组合数据 55 2.6.2 没有名字的类型也是类型 55 2.6.3 使用匿名类型改进实例程序 56 2.6.4 匿名类型的限制 57 2.7 小结 58 第3章 LINQ构建块 61 3.1 LINQ对.NET的扩展 61 3.1.1 语言扩展回顾 61 3.1.2 构成LINQ基础的核心元素 62 3.2 序列 63 3.2.1 IEnumerableT接口 63 3.2.2 迭代器回顾 64 3.2.3 延迟查询执行 66 3.3 查询操作符 69 3.3.1 查询操作符是什么 69 3.3.2 标准查询操作符 71 3.4 查询表达式 72 3.4.1 查询表达式是什么 72 3.4.2 编写查询表达式 73 3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序集以及命名空间 81 3.7 小结 83 第二部分 查询内存的对象 第4章 熟悉LINQ to Objects 86 4.1 实例程序简介 86 4.1.1 程序目标 86 4.1.2 程序功能 87 4.1.3 业务逻辑实体 87 4.1.4 数据库架构 87 4.1.5 示例数据 89 4.2 用LINQ操作内存的集合 90 4.2.1 能够查询什么 90 4.2.2 支持的操作 94 4.3 在ASP.NET和Windows Forms使用LINQ 95 4.3.1 Web应用程序的数据绑定 95 4.3.2 Windows Forms应用程序的数据绑定 100 4.4 常用的标准查询操作符 103 4.4.1 约束操作符Where 104 4.4.2 投影操作符 105 4.4.3 Distinct操作符 107 4.4.4 转换操作符 108 4.4.5 聚合操作符 109 4.5 用不同的方式显示内存的集合 110 4.5.1 排序 110 4.5.2 嵌套查询 111 4.5.3 分组 113 4.5.4 使用连接 114 4.5.5 分区 117 4.6 小结 121 第5章 超越基本的内存数据查询 122 5.1 常见使用场景 122 5.1.1 查询非泛型集合 123 5.1.2 按照多个条件分组 125 5.1.3 动态查询 127 5.1.4 LINQ to Text Files 135 5.2 设计模式 137 5.2.1 函数式创建模式 138 5.2.2 ForEach模式 140 5.3 性能分析 142 5.3.1 选择恰当的流操作方式 142 5.3.2 当心立即执行 144 5.3.3 LINQ to Objects会降低代码的性能吗 146 5.3.4 使用LINQ to Objects的代价 149 5.3.5 性能和简洁:鱼和熊掌不可兼得吗 151 5.4 小结 152 第三部分 查询关系型数据 第6章 LINQ to SQL入门 156 6.1 走入LINQ to SQL 157 6.1.1 创建对象映射 159 6.1.2 设定DataContext 161 6.2 通过LINQ to SQL读取数据 161 6.3 继续改进查询 165 6.3.1 过滤 165 6.3.2 排序和分组 167 6.3.3 聚集 168 6.3.4 连接 169 6.4 操作有层级关系的对象 171 6.5 数据加载的时机以及为何要关心这些 174 6.5.1 延迟加载 174 6.5.2 立即加载详细信息 175 6.6 更新数据 177 6.7 小结 179 第7章 揭开LINQ to SQL的本质 180 7.1 对象与关系数据的映射 180 7.1.1 通过在类添加属性 181 7.1.2 使用外部XML文件实现映射 185 7.1.3 使用SqlMetal工具 186 7.1.4 LINQ to SQL设计器 188 7.2 将查询表达式转换为SQL 190 7.2.1 IQueryable接口 190 7.2.2 表达式树 191 7.3 业务实体的生命周期 193 7.3.1 跟踪变化 195 7.3.2 提交变化 196 7.3.3 操作离线数据 198 7.4 小结 200 第8章 LINQ to SQL高级特性 201 8.1 处理并发修改 201 8.1.1 悲观式并发 201 8.1.2 乐观式并发 202 8.1.3 处理并发异常 204 8.1.4 使用事务解决冲突 207 8.2 高级的数据库功能 208 8.2.1 使用SQL语句直接得到结果对象 209 8.2.2 使用存储过程 210 8.2.3 用户自定义函数 217 8.3 改进业务逻辑层 220 8.3.1 预编译的查询 220 8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML API 234 9.2 为什么需要另外一种XML编程API 235 9.3 LINQ to XML设计原则 236 9.3.1 核心概念:函数式创建 238 9.3.2 核心概念:上下文无关的XML创建过程 238 9.3.3 核心概念:简化了的名称 239 9.4 LINQ to XML相关类的继承体系 241 9.5 在LINQ操作XML 243 9.5.1 加载XML 243 9.5.2 解析XML 245 9.5.3 创建XML 246 9.5.4 使用Visual Basic XML字面量创建XML 249 9.5.5 创建XML文档 251 9.5.6 向XML添加内容 254 9.5.7 从XML移除内容 255 9.5.8 更新XML的内容 256 9.5.9 操作属性 258 9.5.10 保存XML 258 9.6 小结 259 第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ElementsAfterSelf、NodesAfterSelf、ElementsBeforeSelf和NodesBeforeSelf方法 268 10.1.7 Visual Basic的XML轴属性 269 10.2 标准查询操作符 271 10.2.1 使用Select进行投影 273 10.2.2 使用Where实现过滤 274 10.2.3 排序和分组 275 10.3 使用XPath查询LINQ to XML对象 278 10.4 转换XML 279 10.4.1 LINQ to XML转换 279 10.4.2 使用XSLT转换LINQ to XML对象 282 10.5 小结 284 第11章 LINQ to XML常见场景 285 11.1 根据XML构建对象 285 11.1.1 目标 286 11.1.2 实现 287 11.2 根据对象创建XML 290 11.2.1 目标 290 11.2.2 实现 291 11.3 根据数据库的数据创建XML 295 11.3.1 目标 296 11.3.2 实现 297 11.4 过滤并混合从数据库以及XML得到的数据 301 11.4.1 目标 302 11.4.2 实现 302 11.5 读取XML并更新数据库 306 11.5.1 目标 306 11.5.2 实现 307 11.6 将文本文件转换为XML 319 11.6.1 目标 319 11.6.2 实现 320 11.7 小结 322 第五部分 LINQ无处不在 第12章 扩展LINQ 324 12.1 探寻LINQ的扩展机制 324 12.1.1 LINQ各个特性是如何实现的 325 12.1.2 自定义LINQ扩展能够实现什么 326 12.2 创建自定义查询操作符 327 12.2.1 改进标准查询操作符 327 12.2.2 辅助或领域相关的查询操作符 330 12.3 基本查询操作符的自定义实现 334 12.3.1 回顾查询翻译机制 334 12.3.2 查询表达式模式的规范 335 12.3.3 示例1:跟踪标准查询操作符的执行过程 337 12.3.4 限制:查询表达式冲突 338 12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 IQueryable和IQueryProvider:LINQ to Amazon高级版本 352 12.5.1 IQueryable和IQueryProvider接口 353 12.5.2 实现 356 12.5.3 究竟发生了什么 357 12.6 小结 358 第13章 应用程序各层的LINQ 359 13.1 LinqBooks应用程序概览 359 13.1.1 功能 359 13.1.2 程序UI概览 360 13.1.3 数据模型 362 13.2 LINQ to SQL及数据访问层 362 13.2.1 回顾传统的三层架构 362 13.2.2 用专门的数据访问层还是LINQ to SQL 364 13.2.3 LinqBooks对LINQ to SQL的使用 368 13.3 LINQ to XML的使用 374 13.3.1 从Amazon导入数据 374 13.3.2 生成RSS 376 13.4 LINQ to DataSet的使用 377 13.5 使用LINQ to Objects 380 13.6 可扩展性 380 13.6.1 自定义查询操作符 380 13.6.2 创建并使用自定义LINQ提供器 381 13.7 展望未来 381 13.7.1 自定义LINQ功能 382 13.7.2 LINQ to XSD:强类型的LINQ to XML 382 13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能 386 14.2.2 DataSet是什么 387 14.2.3 Visual Studio 2008和.NET 3.5为支持LINQ to DataSet进行的改进 389 14.3 查询弱类型DataSet 390 14.3.1 为DataSet加载数据 390 14.3.2 不使用LINQ查询DataSet 394 14.3.3 使用LINQ to DataSet查询弱类型DataSet 395 14.4 查询强类型DataSet 399 14.4.1 生成强类型的DataSet 400 14.4.2 为强类型DataSet加载数据 402 14.4.3 使用LINQ to DataSet查询强类型DataSet 404 14.5 将LINQ to DataSet查询结果绑定至UI控件 406 14.5.1 使用CopyToDataTable将LINQto DataSet查询结果复制到DataTable 406 14.5.2 使用AsDataView实现双向数据绑定 408 14.6 在LINQ to DataSet使用查询操作符 410 14.6.1 用于DataRow的FieldT和SetFieldT操作符 410 14.6.2 集合操作符以及用DataRowComparer比较DataRow 411 14.7 小结 412 附录 标准查询操作符 414 作者介绍 -------------------------------------------------------------------------------- 马格里(Fabrice Marguerie),微软C# MVP,资深.NET软件架构师,LINQ社区专家。
清晰完整PDF版本,是我从网上买来的 共 60MB,分为11个分卷 在 CSDN 上只有我整个是清晰完整的 LINQ 实战 11/11 LINQ 实战 .NET 2010 SQL 出版社:人民邮电出版社 ISBN:9787115208514 原价:65元 作者:(法)马格里,(美)艾歇特,(美)伍利 著,陈黎夫 译 出版日期:2009-8-1 字数:668000 页码:416 内容提要 -------------------------------------------------------------------------------- 作为.NET上连接编程语言和数据库、内存对象、XML等各种类型数据之间的桥梁,LINQ引入了一种处理数据的全新理念,将查询无缝集成至开发语言之上。本书第一部分介绍了LINQ技术及C#和VB为此提供的新语言特性,第二、三、四部分详细介绍了LINQ的三大主要功能LINQ to Objects、LINQ to SQL、LINQ to XML,第五部分研究了LINQ的可扩展性、在应用程序使用各种LINQ功能的方法以及LINQ to DataSet。   本书适合于使用C#和VB.NET的软件开发者。 编辑推荐 -------------------------------------------------------------------------------- 微软MVP呕心沥血之作,LINQ圣经,深入全面,引人入胜,丰富实例,兼顾C#和VB.NET语言。   本书作者是LINQ社区的重要成员,他们在书展示了这一技术的精髓……快去享受这一盛宴吧。          ——Matt Warren,微软主架构师,LINQ之父   LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!         ——Patrick Smacchia,微软MVP,《C#和.NET 2.0 实战》作者 目录 -------------------------------------------------------------------------------- 第一部分 从这里开始 第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 1.3 LINQ的设计目标及起源 13 1.3.1 LINQ项目的设计目标 13 1.3.2 一点历史 14 1.4 LINQ to Objects初步:查询内存的集合 15 1.4.1 先决条件 15 1.4.2 Hello LINQ to Objects 17 1.5 LINQ to XML初步:查询XML文档 20 1.5.1 为什么需要LINQ to XML 20 1.5.2 Hello LINQ to XML 22 1.6 LINQ to SQL初步:查询关系型数据库 26 1.6.1 LINQ to SQL功能概览 26 1.6.2 Hello LINQ to SQL 26 1.6.3 进一步了解LINQ to SQL 30 1.7 小结 30 第2章 C#和VB语言的增强特性 31 2.1 新语言的增强特性一瞥 31 2.1.1 列出当前正在运行的所有进程 32 2.1.2 将返回结果封装成类 33 2.2 隐式类型局部变量 34 2.2.1 语法 35 2.2.2 使用隐式类型局部变量改进实例程序 35 2.3 对象和集合的初始化器 37 2.3.1 引入对象初始化器的动机 37 2.3.2 集合初始化器 38 2.3.3 用对象初始化器改进实例程序 39 2.4 Lambda表达式 40 2.4.1 委托回顾 40 2.4.2 匿名方法 42 2.4.3 Lambda表达式介绍 42 2.5 扩展方法 47 2.5.1 创建扩展方法的示例 47 2.5.2 更多使用LINQ标准查询操作符的例子 50 2.5.3 将扩展方法引入到实例程序 51 2.5.4 注意事项 52 2.6 匿名类型 54 2.6.1 使用匿名类型组合数据 55 2.6.2 没有名字的类型也是类型 55 2.6.3 使用匿名类型改进实例程序 56 2.6.4 匿名类型的限制 57 2.7 小结 58 第3章 LINQ构建块 61 3.1 LINQ对.NET的扩展 61 3.1.1 语言扩展回顾 61 3.1.2 构成LINQ基础的核心元素 62 3.2 序列 63 3.2.1 IEnumerableT接口 63 3.2.2 迭代器回顾 64 3.2.3 延迟查询执行 66 3.3 查询操作符 69 3.3.1 查询操作符是什么 69 3.3.2 标准查询操作符 71 3.4 查询表达式 72 3.4.1 查询表达式是什么 72 3.4.2 编写查询表达式 73 3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序集以及命名空间 81 3.7 小结 83 第二部分 查询内存的对象 第4章 熟悉LINQ to Objects 86 4.1 实例程序简介 86 4.1.1 程序目标 86 4.1.2 程序功能 87 4.1.3 业务逻辑实体 87 4.1.4 数据库架构 87 4.1.5 示例数据 89 4.2 用LINQ操作内存的集合 90 4.2.1 能够查询什么 90 4.2.2 支持的操作 94 4.3 在ASP.NET和Windows Forms使用LINQ 95 4.3.1 Web应用程序的数据绑定 95 4.3.2 Windows Forms应用程序的数据绑定 100 4.4 常用的标准查询操作符 103 4.4.1 约束操作符Where 104 4.4.2 投影操作符 105 4.4.3 Distinct操作符 107 4.4.4 转换操作符 108 4.4.5 聚合操作符 109 4.5 用不同的方式显示内存的集合 110 4.5.1 排序 110 4.5.2 嵌套查询 111 4.5.3 分组 113 4.5.4 使用连接 114 4.5.5 分区 117 4.6 小结 121 第5章 超越基本的内存数据查询 122 5.1 常见使用场景 122 5.1.1 查询非泛型集合 123 5.1.2 按照多个条件分组 125 5.1.3 动态查询 127 5.1.4 LINQ to Text Files 135 5.2 设计模式 137 5.2.1 函数式创建模式 138 5.2.2 ForEach模式 140 5.3 性能分析 142 5.3.1 选择恰当的流操作方式 142 5.3.2 当心立即执行 144 5.3.3 LINQ to Objects会降低代码的性能吗 146 5.3.4 使用LINQ to Objects的代价 149 5.3.5 性能和简洁:鱼和熊掌不可兼得吗 151 5.4 小结 152 第三部分 查询关系型数据 第6章 LINQ to SQL入门 156 6.1 走入LINQ to SQL 157 6.1.1 创建对象映射 159 6.1.2 设定DataContext 161 6.2 通过LINQ to SQL读取数据 161 6.3 继续改进查询 165 6.3.1 过滤 165 6.3.2 排序和分组 167 6.3.3 聚集 168 6.3.4 连接 169 6.4 操作有层级关系的对象 171 6.5 数据加载的时机以及为何要关心这些 174 6.5.1 延迟加载 174 6.5.2 立即加载详细信息 175 6.6 更新数据 177 6.7 小结 179 第7章 揭开LINQ to SQL的本质 180 7.1 对象与关系数据的映射 180 7.1.1 通过在类添加属性 181 7.1.2 使用外部XML文件实现映射 185 7.1.3 使用SqlMetal工具 186 7.1.4 LINQ to SQL设计器 188 7.2 将查询表达式转换为SQL 190 7.2.1 IQueryable接口 190 7.2.2 表达式树 191 7.3 业务实体的生命周期 193 7.3.1 跟踪变化 195 7.3.2 提交变化 196 7.3.3 操作离线数据 198 7.4 小结 200 第8章 LINQ to SQL高级特性 201 8.1 处理并发修改 201 8.1.1 悲观式并发 201 8.1.2 乐观式并发 202 8.1.3 处理并发异常 204 8.1.4 使用事务解决冲突 207 8.2 高级的数据库功能 208 8.2.1 使用SQL语句直接得到结果对象 209 8.2.2 使用存储过程 210 8.2.3 用户自定义函数 217 8.3 改进业务逻辑层 220 8.3.1 预编译的查询 220 8.3.2 使用部分类实现自定义业务逻辑 221 8.3.3 使用部分方法 223 8.3.4 使用对象继承 225 8.4 LINQ to Entities简介 229 8.5 小结 231 第四部分 操作XML 第9章 LINQ to XML入门 234 9.1 什么是XML API 234 9.2 为什么需要另外一种XML编程API 235 9.3 LINQ to XML设计原则 236 9.3.1 核心概念:函数式创建 238 9.3.2 核心概念:上下文无关的XML创建过程 238 9.3.3 核心概念:简化了的名称 239 9.4 LINQ to XML相关类的继承体系 241 9.5 在LINQ操作XML 243 9.5.1 加载XML 243 9.5.2 解析XML 245 9.5.3 创建XML 246 9.5.4 使用Visual Basic XML字面量创建XML 249 9.5.5 创建XML文档 251 9.5.6 向XML添加内容 254 9.5.7 从XML移除内容 255 9.5.8 更新XML的内容 256 9.5.9 操作属性 258 9.5.10 保存XML 258 9.6 小结 259 第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ElementsAfterSelf、NodesAfterSelf、ElementsBeforeSelf和NodesBeforeSelf方法 268 10.1.7 Visual Basic的XML轴属性 269 10.2 标准查询操作符 271 10.2.1 使用Select进行投影 273 10.2.2 使用Where实现过滤 274 10.2.3 排序和分组 275 10.3 使用XPath查询LINQ to XML对象 278 10.4 转换XML 279 10.4.1 LINQ to XML转换 279 10.4.2 使用XSLT转换LINQ to XML对象 282 10.5 小结 284 第11章 LINQ to XML常见场景 285 11.1 根据XML构建对象 285 11.1.1 目标 286 11.1.2 实现 287 11.2 根据对象创建XML 290 11.2.1 目标 290 11.2.2 实现 291 11.3 根据数据库的数据创建XML 295 11.3.1 目标 296 11.3.2 实现 297 11.4 过滤并混合从数据库以及XML得到的数据 301 11.4.1 目标 302 11.4.2 实现 302 11.5 读取XML并更新数据库 306 11.5.1 目标 306 11.5.2 实现 307 11.6 将文本文件转换为XML 319 11.6.1 目标 319 11.6.2 实现 320 11.7 小结 322 第五部分 LINQ无处不在 第12章 扩展LINQ 324 12.1 探寻LINQ的扩展机制 324 12.1.1 LINQ各个特性是如何实现的 325 12.1.2 自定义LINQ扩展能够实现什么 326 12.2 创建自定义查询操作符 327 12.2.1 改进标准查询操作符 327 12.2.2 辅助或领域相关的查询操作符 330 12.3 基本查询操作符的自定义实现 334 12.3.1 回顾查询翻译机制 334 12.3.2 查询表达式模式的规范 335 12.3.3 示例1:跟踪标准查询操作符的执行过程 337 12.3.4 限制:查询表达式冲突 338 12.3.5 示例2:非泛型的、领域相关的操作符 340 12.3.6 示例3:非序列的查询操作符 342 12.4 查询Web服务:LINQ to Amazon 343 12.4.1 LINQ to Amazon介绍 344 12.4.2 需求 345 12.4.3 实现 346 12.5 IQueryable和IQueryProvider:LINQ to Amazon高级版本 352 12.5.1 IQueryable和IQueryProvider接口 353 12.5.2 实现 356 12.5.3 究竟发生了什么 357 12.6 小结 358 第13章 应用程序各层的LINQ 359 13.1 LinqBooks应用程序概览 359 13.1.1 功能 359 13.1.2 程序UI概览 360 13.1.3 数据模型 362 13.2 LINQ to SQL及数据访问层 362 13.2.1 回顾传统的三层架构 362 13.2.2 用专门的数据访问层还是LINQ to SQL 364 13.2.3 LinqBooks对LINQ to SQL的使用 368 13.3 LINQ to XML的使用 374 13.3.1 从Amazon导入数据 374 13.3.2 生成RSS 376 13.4 LINQ to DataSet的使用 377 13.5 使用LINQ to Objects 380 13.6 可扩展性 380 13.6.1 自定义查询操作符 380 13.6.2 创建并使用自定义LINQ提供器 381 13.7 展望未来 381 13.7.1 自定义LINQ功能 382 13.7.2 LINQ to XSD:强类型的LINQ to XML 382 13.7.3 PLINQ:支持并行计算的LINQ 383 13.7.4 LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383 13.8 小结 384 第14章 使用LINQ操作DataSet 385 14.1 LINQ to DataSet概览 385 14.2 DataSet回顾 386 14.2.1 DataSet使用场景及功能 386 14.2.2 DataSet是什么 387 14.2.3 Visual Studio 2008和.NET 3.5为支持LINQ to DataSet进行的改进 389 14.3 查询弱类型DataSet 390 14.3.1 为DataSet加载数据 390 14.3.2 不使用LINQ查询DataSet 394 14.3.3 使用LINQ to DataSet查询弱类型DataSet 395 14.4 查询强类型DataSet 399 14.4.1 生成强类型的DataSet 400 14.4.2 为强类型DataSet加载数据 402 14.4.3 使用LINQ to DataSet查询强类型DataSet 404 14.5 将LINQ to DataSet查询结果绑定至UI控件 406 14.5.1 使用CopyToDataTable将LINQto DataSet查询结果复制到DataTable 406 14.5.2 使用AsDataView实现双向数据绑定 408 14.6 在LINQ to DataSet使用查询操作符 410 14.6.1 用于DataRow的FieldT和SetFieldT操作符 410 14.6.2 集合操作符以及用DataRowComparer比较DataRow 411 14.7 小结 412 附录 标准查询操作符 414 作者介绍 -------------------------------------------------------------------------------- 马格里(Fabrice Marguerie),微软C# MVP,资深.NET软件架构师,LINQ社区专家。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值