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

转载 2007年09月13日 12:26:00

又来抄袭了,呵呵。不过我信奉,好东西要留在自己手里。

我抄袭的地址:http://dev.yesky.com/msdn/296/7548296.shtml

随着岁月的流逝,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 { getset; }
4         public string NickName { getset; }
5         public int Age { getset; }
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);
3public static IEnumerable<TSource> Where<TSource>(
4      this IEnumerable<TSource> source, Func<TSource, intbool> 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。

 

[.NET 3.x新特性三]Lambda表达式

 随着岁月的流逝,VS也从2005慢慢的步入2008,.NET也将进入3.5版本,学习的脚步也要慢慢赶上。今天我们来看看C#3.0的又一特性Lambda表达式,它由2.0代理演化而来,也是为LinQ做...
  • lanmao100
  • lanmao100
  • 2008年02月21日 09:35
  • 422

Java8 新特性 lambda表达式详解

java8新特性 lambda表达式详解
  • xiaochuanding
  • xiaochuanding
  • 2017年02月17日 16:41
  • 3755

jdk1.8 新特性之 lambda表达式

我们首先看一个java实现多线程的lambda表达式的例子常规Runnable runnable = new Runnable(){ @Override ...
  • dounine
  • dounine
  • 2017年04月23日 21:30
  • 7442

asp.net lambda表达式的用法

一、lambda表达式语法   Lambda表达式可以有多个参数、一个参数,或者没有参数。   格式: (参数列表)=>表达式或语句块 表现形式为 1.一个参数:param=>exp...
  • jkpi888
  • jkpi888
  • 2014年01月03日 12:55
  • 1420

JDK1.8新特性(二)Lambda表达式入门

网上关于Java lambda的例子很多,但是这些五花八门的例子很不常见不常用,最后导致初学者望而却步,其实我们抓住lambda的本质之后,会发现lambda还是很好理解的。毕竟,java8设计lam...
  • sunp_csdn
  • sunp_csdn
  • 2017年02月13日 16:43
  • 986

[.NET 3.x新特性五]匿名类型

今天我们来看看C#3.0中的最后一个特性:匿名类型。什么是匿名类型呢?在我们开发过程中离不开JS,JS中的变量声明就属于匿名类型。匿名类型有一个关键字var,但是在C#3.0中的匿名类型在CLR并没有...
  • lanmao100
  • lanmao100
  • 2008年02月21日 09:41
  • 365

[.NET 3.x新特性二]扩展方法

 今天我们接着看一下.NET 3.x的新特性:扩展方法。这里需要说明的是我所说的.NET 3.x的新特性,其实是C# 3.0的一些新特性,考虑到LinQ等我就把这些特性叫做.NET 3.x新特性。可能...
  • lanmao100
  • lanmao100
  • 2008年02月21日 09:34
  • 381

C#中的lambda表达式与委托的关系

通过本文的例子就可以理解委托与lambda表达式的关系
  • wangpeng2011314
  • wangpeng2011314
  • 2017年02月26日 20:38
  • 262

.net framework3.5新特性(2):Lambda表达式

 本文为原创,如需转载,请注明作者和出处,谢谢!    在C#2.0及C#1.x中,需要使用delegate来定义方法指针。如下面的代码如示:Code highlighting produced by...
  • nokiaguy
  • nokiaguy
  • 2009年03月09日 10:32
  • 1063

MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。         随后在 2015年3月17日 发布...
  • yumushui
  • yumushui
  • 2015年04月28日 10:42
  • 1051
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET 3.x新特性之Lambda表达式
举报原因:
原因补充:

(最多只允许输入30个字)