Lambda表达式
"Lambda表达式"是一个匿名函数,它可以包含表达式和语句.并可用于创建委托或表达式目录树类型.
运算符
所有Lambda表达式都是用Lambda运算符=>,读做goes to.该运算符左边是输入参数,右边包含表达式或语句块.
Lambda表达式 x=>x*x读作 x goes to x 乘 x.可将此表达式分配给委托类型.
例:
protected void Page_Load(object sender, EventArgs e) { cc c = x => x * x; Response.Write(c(12).ToString()); } public delegate int cc(int i);
在上例中,请注意委托的参数是一个具有int类型的隐式类型输入参数,并返回int.在将lambda表达式转化为该类型的委托时,编译器会隐式的将该表达式中的参数转换为int.并返回一个int类型的值.
=>运算符具有与=运算符同级的优先级,并且是右结合运算符.
Lambda表达式
表达式在右边的Lambda表达式称为"Lambda表达式".采用以下基本形式.
(input parameters)=>expression
在lambda表达式只有一个参数时,括号才是可选的;否则括号是必须的.建议保留括号.
Lambda语句
Lambda语句与Lambda表达式相似,只是语句包含在大括号里.
(input parameters)=>{statement;}
Lambda语句的主体可以包含任意数量的语句.但是通常不会多与两句或三句.
Lambda表达式的类型推理
在编写Lambda时,通常不必为输入参数指定类型,因为编译器可以基于Lambda主体、基础委托类型以及C#3.0语言规范中描述的其他因素推断类型.
Lambda的一般规则如下:
1.lambda包含的参数数量必须与委托类型包含的参数数量一致
2.lambda中每个输入参数必须都能够隐式转换为其对应的委托参数
3.lambda的返回值必须能隐式的转换为委托的返回类型
例子:
bool GetStringWithFourCharacters(string str) { return str.Length == 4; } protected void Page_Load(object sender, EventArgs e) { string[] strs = new string[] { "abcd""bcde", "123s", "acee", }; //方法一、 //创建Func<string,bool>的实例这种方式来获取方法与下面一种直接赋值的做法都可以. //Func<string, bool> func = new Func<string, bool>(GetStringWithFourCharacters); Func<string, bool> func = GetStringWithFourCharacters; IEnumerable<string> result = strs.Where<string>(func); //方法二、 //IEnumerable<string> result = strs.Where<string>(delegate(string x) { return x.Length == 4; }); //方法三、 //IEnumerable<string> result = strs.Where<string>(x => x.Length == 4); foreach (var r in result) { Response.Write(r.ToString()+"<br/>"); } }
这三种方式都可以实将字符串数组中,为四个字符的字符串挑出来的功能.但是,哪一个最简单呢?显然第一个复杂些,第二个和第三个都比较简单.
其实第二个和第三个是等价的.建议使用第三种,上面的例子比较简单,只需要筛选出来即可,如果再要求都转成大写的呢? 再进行排序呢?
protected void Page_Load(object sender, EventArgs e) { string[] strs = new string[] { "abcd", "bcde", "123s", "acee" }; //方法二 //IEnumerable<string> result = strs.Where<string>(delegate(string x) { return x.Length == 4; }) // .Select<string, string>(delegate(string x) { return x.ToUpper(); }) // .OrderBy<string, string>(x => x); //方法三 IEnumerable<string> result = strs.Where<string>(x => x.Length == 4) .Select<string, string>(x => x.ToUpper()) .OrderBy<string, string>(x => x); foreach (var r in result) { Response.Write(r.ToString()+"<br/>"); } }
从代码中,可以看到,使用Lambda表达式似乎更简单一些的
Lambda表达式在上例中的使用是:
- 选出只有4个字符的字符串
- 将字符串变成大写的
- 进行排序