频道直达:新闻 - 组网 - 安全 - 服务器 - 存储 - 系统 - 应用 - 开发 - 数据库 - 前沿 - 技术人 - 培训 - 求职 - 读书 - 教程 - 专题 - 产品 - 案例 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

.NET 3.x新特性之Lambda表达式

作者: 网魂小兵 出处:天极网 2007-09-14 11:07    砖    好    评论   进入论坛
阅读提示:本文介绍C# 3.0的又一特性Lambda表达式,它由2.0代理演化而来,是为LinQ做必要的准备。

随着岁月的流逝,VS也从2005慢慢的步入2008,.NET也将进入3.5版本,学习的脚步也要慢慢赶上。现在我们来看看C# 3.0的又一特性Lambda表达式,它由2.0代理演化而来,也是为LinQ做好必要的准备。Lambda表达式首先我们要知道他的运算符“=>”,在我以前的一篇文章中可以得到在不同版本中所使用代理和通过Lambda表达式的一个例子,你可以在这里看到:C# 3.0新特性概览。我们举个另外的例子,让我们更好的理解这个Lambda表达式,因为我们在LinQ中会经常用到这个东东,所以就应该好好看看,况且这也不是什么难事。

我们在[.NET 3.x新特性一]自动属性,对象初始化及集合初始化中讲到了自动化属性和集合的初始化,为了讲解Lambda表达式我们首先定义一个实体类,代码如下:

1 public class Person 
2 {
3   public string Name { get; set; }
4   public string NickName { get; set; }
5   public int Age { get; set; }
6 }

我们将其初始化一个List列表,并从中获取Age为23的Person实例和类表中所有实例中Age的平均值。当然其中也用到了扩展方法,这也是属于LinQ的一个范畴,代码如下:

1 List<Person> people = new List<Person>
2    {
3      new Person{Name="小兵",NickName="网魂小兵",Age=23},
4      new Person{Name="青青",NickName="QQing",Age=22}
5    };
6      //取得people中Age为23的Person实例。
7      IEnumerable<Person> results = people.Where(p => p.Age == 23);
8      //计算people中的平均岁数。
9      int perAge = people.Average(p => p.Age);

看到Lambda表达式了吗?p=>p这个就是Lambda表达式,当然Where和Average就是扩展方法,是LinQ的一个扩展方法。当然我们在C#或者说在.NET 2.0中也能够做到,但是可没有那么简单(其实也不难),下面我们看一下在.NET 2.0中的实现方法:

1  List<Person> people = new List<Person>
2    {
3     new Person{Name="小兵",NickName="网魂小兵",Age=23},
4     new Person{Name="青青",NickName="QQing",Age=22}
5    };
6
7    IEnumerable<Person> results = people.Where(delegate(Person p)
    { return p.Age == 23; });
8
9    int perAge = people.Sum(delegate(Person p) { return p.Age; });

从上面我们也能够做到同样的效果,但是代码比用Lambda复杂了一点。下面我们看看这种代理方法的扩展是如何实现的呢?首先我们当然是右键选择“转到定义”就可以看到Where的扩展:

1 public static IEnumerable<TSource> Where<TSource>(
2 this IEnumerable<TSource> source, Func<TSource, bool> predicate);
3 public static IEnumerable<TSource> Where<TSource>(
4 this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);

我们来看看Where的代码:

1 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,
2  Func<TSource, bool> predicate)
3         {
4             foreach (TSource s in source)
5             {
6                 if (predicate(s))
7                 {
8                     yield return s;
9                 }
10             }
11         }

从上面的代码中我们可以看出是对IEnumerable的扩展,而predicate是一个Func的代理,Func代理的第二个类型是返回的类型,而第一个类型是参数的类型。如果是Func则最后一个是代理返回的类型(就是这个代理方法执行后的结果),其他都是参数(代理方法的参数,依次排列),就上述代码而言predicate执行后返回true的就迭代返回实例s。

OK!今天就这样了,这个表达式在LinQ中还会经常用到,让他在我们的应用和实践中慢慢深入。

【相关文章】

【责任编辑:火凤凰 TEL:(010)68476606】

专题
专题:ASP.NET 2.0基础开发指南
.NET移动与嵌入式技术专题
.NET Framework新手入门专题
VS.NET实用开发专题
ADO.NET实用技巧专题
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看81024次)
·UML类图详解 (查看72498次)
·C++是垃圾语言?! (查看42631次)
·C#技术开发指南 (查看40232次)
·UML统一建模语言 (查看39205次)
·Java编程开发手册 (1198个砖)
·Java基础教程 (431个砖)
·C#技术开发指南 (311个砖)
·.NET开发手册 (254个砖)
·PB开发教程 (223个砖)
·Java编程开发手册 (658个好)
·Java基础教程 (578个好)
·.NET开发手册 (282个好)
·PB开发教程 (213个好)
·Delphi开发技术手册 (200个好)
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。