当前时间 加入收藏 设为首页 联系站长
先锋站长网
您的位置:>首页 -> 技术文章 -> .NET编程->.NET 3.x新特性之Lambda表达式
.NET 3.x新特性之Lambda表达式
来源: | 作者: | 时间:2008-03-18 22:12:04 | 录入者:admin
 随着岁月的流逝,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  publicclassPerson
2  {
3    publicstringName{get;set;}
4    publicstringNickName{get;set;}
5    publicintAge{get;set;}
6  }

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

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

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

1      List<Person>people=newList<Person>
2        {
3          newPerson{Name="小兵",NickName="网魂小兵",Age=23},
4                   newPerson{Name="青青",NickName="QQing",Age=22}
5         };
6
7      IEnumerable<Person>results=people.Where(delegate(Personp){returnp.Age==23;});
8
9      intperAge=people.Sum(delegate(Personp){returnp.Age;});

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

1 publicstaticIEnumerable<TSource>Where<TSource>(
2   thisIEnumerable<TSource>source,Func<TSource,bool>predicate);
3publicstaticIEnumerable<TSource>Where<TSource>(
4   thisIEnumerable<TSource>source,Func<TSource,int,bool>predicate);

  我们来看看Where的代码:

1publicstaticIEnumerable<TSource>Where<TSource>(thisIEnumerable<TSource>source,
2 Func<TSource,bool>predicate)
3    {
4      foreach(TSourcesinsource)
5      {
6        if(predicate(s))
7        {
8          yieldreturns;
9        }
10      }
11    }

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

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

[上一篇].Net编程接口剖析系列之比较和排序 [下一篇]使用.NET实现你的IP切换器
 评 论
称  呼:
内  容:
·本站发布内容均为客观表达作者观点,不代表本站立场,请勿攻击和漫骂
·网游发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
最新文章
站长先锋|先锋站长网 (17日)
企业邮局不断壮大 时代邮箱再.. (26日)
网店办照试行 无本经营亮剑何.. (20日)
CN域名年增长率达94.6% (14日)
解读:“.中国”域名幕后的争.. (14日)
后奥运时代互联网将刮繁体风 (11日)
IE8发布与“.中国”域名系统.. (04日)
抢滩WindowsServer2008 主机.. (28日)
“解百纳”千千结难解 .TM域.. (21日)
奥运商机刺激主机市场供求 (16日)
精彩推荐
站长先锋|先锋站长网 (17日)
企业邮局不断壮大 时代邮箱再添 (26日)
网店办照试行 无本经营亮剑何方 (20日)
CN域名年增长率达94.6% (14日)
解读:“.中国”域名幕后的争夺 (14日)
后奥运时代互联网将刮繁体风 (11日)
IE8发布与“.中国”域名系统启 (04日)
抢滩WindowsServer2008 主机商 (28日)
“解百纳”千千结难解 .TM域名 (21日)
观察:中小网站或渐成互联网主角 (14日)
热门咨询
Fs2You为您提供无限大小免费.. (28日)
用电子商务的网站进行信用卡.. (17日)
免费CN域名注册,每个人最多可.. (28日)
由站长论坛为您提供cn或者com.. (28日)
wap站长大全 (17日)
免费600提供600M免费ASP空间 (28日)
ASP如何获取客户端真实IP地址 (26日)
中国网络为注册会员免费赠送.. (28日)
地方分类信息网站推广重心! (16日)
如何编程删除access表中所有.. (22日)
联系方式:MSN:xFzz@hotmail.com QQ:486031、219741、54817814 电话:010-67216557
Copyright@xFzz.com all rights reserved 京ICP备05047353号
Powered by xFzz Code © 2003-07 bbs.xFzz.com