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睡觉了..哈哈..