C#3.0 Lambda 运算符(笔记)

-

 C#3.0推出了Lambda表达式,这个东西是用来干麻呢,在此之前,只听其名,未闻其身.据了解后,Lambda表达式只是用更简单的方法来写匿名方法,简化了很多东西,下面我们一起探讨吧:)

       比如我们现在有一个List<int>对象,里面包含了一些数据

 List<int> list = new List<int>();

list.AddRange(new int[]{1,2,3,4});

现在我们想把list中偶数值放到另一个List<int>变量中,应如何做呢,传统方法,是用循环遍历所有数据,代码如下:

List<int>  evenList = new List<int>();

foreach(int i in list)

{

    if ( (i%2)==0 )

      evenList.Add(i);

}

 

这样的代码,看上去没有什么问题,能达到我们预期所要的功能,但代码我们想要更简洁的方法,不知有没有呢?答案是肯定的!

这时我们可以使用C#的匿名方法,代码如下:

List<int> evenList = list.FindAll( delegate(int i)

      {

            return (i%2)==0;

      }

);

 

上面的代码使用C#的匿名方法完成的,看上去好像比原先用循环的好了很多...那再请问,有没有再更简洁的方法呢(喂,你这摆明是找茬啊,还好,确实有:)),想知道,请继续看下面的代码(使用Lambda表达式)

List<int> evenList = list.FindAll(i => (i % 2) == 0);

一句话?是的,就是一句话!

运行了下,确实可以完成功能,但这奇怪的语法表示什么呢!没事,接下来我们一一解决这些疑问..

Lambda表达式是这样编写的:首先定义一个参数列表,"=>"标记(这个是固定的),接着就是写你的代码拉!表达式可以理解成这样

参数列表 => 你的代码

从上面的代码中可以看出i就是一个参数,只是没有标记成强类型而以,是隐式类型化,Lambda表达式的上下文和底层委托推断出是一个整型,当然,你也可以显式显示参数的类型,List<int> evenList = list.FindAll(i => (i % 2) == 0); 这一行,有多种写法,如下

List<int> evenList = list.FindAll( ( i ) => (i % 2) == 0);

List<int> evenList = list.FindAll( ( int i  )=> (i % 2) == 0);

都是同等的..这下是不是感觉有点清楚了..

 

这时你可能会说,这Lambda表达式也没有多大作用呀,只能写一句代码,如果我要处理的逻辑比较复杂又该如何呢,这东西是不是派不上用场了呀,呵呵,你想到的,微软怎么可能没有想到呢.如果是需要处理比较复杂的业务逻辑的话,可以使用多个语句处理参数,请看下面代码..

List<int> evenList = List.FindAll( (int i) =>

{

    //在这里你想写什么代码就写什么代码吧!

    Console.WriteLine("Value of is currently:{0}",i);

    bool isEven = ((i%2)==0);

    return isEven;

});

上面的代码是不是能完成你所需要的呢!这时又有人会问,上面的Lambda表达式从头到尾都是只有一个参数,是不是只能用一个参数呀,如果是的话,那他也没有什么用呀,还有,可能我的业务处理不需要参数呢,...请下面代码一一为你解答:

public Class SimpleMath

{

      public delegate void MathMessage(string msg,int result);   //委托

      private MathMessage mmDelegate;   //事件

      public void SetMathhandler(MathMessage target)

      {mmDelegate = target;}

      public void Add(int x,int y)

      {

            if( mmDelegate != null )

                  mmDelegate.Invoke("Adding has completed!" , x + y );

       }

}

static void Main(string[] args)

{

      SimpleMath m = new SimpleMath();

      m.SetMathHandler( (msg,result) =>

      {Consule.WriteLine("msg="+msg+",result="+result);  } );

      m.Add(2,2);

     Console.ReadLine();

}

应该都注意到上面的Lambda是用了两个参数了,如有多个,继续添加即可..那还有上面提到的,如果是没有参数呢?不急,请接着看(快完拉)

      public delegate void MathMessage2();   //委托

      private MathMessage2 mmDelegate2;   //事件

      public void SetMathhandler(MathMessage2 target)

      {mmDelegate2 = target;}

      public void ShowABC()

      {

            if( mmDelegate2 != null )

                  mmDelegate2.Invoke( );

       }

static void Main(string[] args)

{

      SimpleMath m = new SimpleMath();

      m.SetMathHandler2( () =>

      {Consule.WriteLine("我是没有参数滴.."); } );

      m.ShowABC();

     Console.ReadLine();

}

 

至此,相信读者已经可以大概了解Lambda表达式的整体角色和它是如何以"函数方式"与匿名方法和委托类型共同工作的.可能刚刚接触的时候,是需要花一点时间来适应这种"奇怪"的语法,不过它却给我们带来极大的方便..让程序更加简洁...

PS:LINQ编程模型使用了许多Lambda表达式来简化编码的.

 

代码没有高亮显示,确实不爽,网易的博客可能就是这样吧,当然,我也没有细心去找..呵呵!打局Dota睡觉了..哈哈..

 

posted on 2010-06-11 23:44  Ss_Andy  阅读(2336)  评论(0编辑  收藏  举报