|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也不知道,我同学昨天说数据挖掘很好。Lambda表达式的实质是“匿名办法”,也便是当编译我们的程序代码时,“编译器”会主动帮我们将“Lambda表达式”转换为“匿名办法”,以下例:
string[]names={"agen","balen","coure","apple"};
string[]findNameA=Array.FindAll<string>(names,delegate(stringv)
{
returnv.StartsWith("a");
});
string[]findNameB=Array.FindAll<string>(names,v=>v.StartsWith("a"));
下面中两个FindAll办法的反编译代码以下:
string[]findNameA=Array.FindAll<string>(names,delegate(stringv){
returnv.StartsWith("a");
});
string[]findNameB=Array.FindAll<string>(names,delegate(stringv){
returnv.StartsWith("a");
});
从而能够晓得“Lambda表达式”与“匿名办法”是能够划上等号的,只不外利用“Lambda表达式”输写代码看上往更直不雅大度,不是吗?
“Lambda表达式”的语法格局:
参数列=>语句或语句块
个中“参数列”中可包括恣意个参数(与托付对应),假如参数列中有0个或1个以上参数,则必需利用括号括住参数列,以下:
()=>Console.Write("0个参数")
i=>Console.Write("1个参数时参数列中可省略括号,值为:{0}",i)
(x,y)=>Console.Write("包括2个参数,值为:{0}*{1}",x,y)
而“语句或语句块”中假如只要一条语句,则能够不必年夜括号括住不然则必需利用,以下:
i=>Console.Write("只要一条语句")
i=>{Console.Write("利用年夜括号的表达式");}
//两条语句时必需要年夜括号
i=>{i++;Console.Write("两条语句的情形");}
假如“语句或语句块”有前往值时,假如只要一条语句则能够不输写“return”语句,编译器会主动处置,不然必需加上,以下示例:
classTest
{
delegateintAddHandler(intx,inty);
staticvoidPrint(AddHandleradd)
{
Console.Write(add(1,3));
}
staticvoidMain()
{
Print((x,y)=>x+y);
Print((x,y)=>{intv=x*10;returny+v;});
Console.Read();
}
}
“Lambda表达式”是托付的完成办法,以是必需遵守以下划定规矩:
1)“Lambda表达式”的参数数目必需和“托付”的参数数目不异;
2)假如“托付”的参数中包含有ref或out润色符,则“Lambda表达式”的参数列中也必需包含有润色符;
例子:
classTest
{
delegatevoidOutHandler(outintx);
staticvoidPrint(OutHandlertest)
{
inti;
test(outi);
Console.Write(i);
}
staticvoidMain()
{
Print((outintx)=>x=3);
Console.Read();
}
}
注:假如包含有润色符,则“Lambda表达式”中的参数列中也必需加上参数的范例!
3)假如“托付”有前往范例,则“Lambda表达式”的“语句或语句块”中也必需前往不异范例的数据;
4)假如“托付”有几种数据范例格局而在“Lambda表达式”中“编译器”没法揣度详细数据范例时,则必需手动明白数据范例。
例子:
(毛病代码)
classTest
{
delegateTAddHandler<T>(Tx,Ty);
staticvoidPrint(AddHandler<int>test)
{
Console.WriteLine("inttype:{0}",test(1,2));
}
staticvoidPrint(AddHandler<double>test)
{
Console.WriteLine("doubletype:{0}",test(1d,2d));
}
staticvoidMain()
{
Print((x,y)=>x+y);
Console.Read();
}
}
当我们编译以下代码时,编译器将会显现以下毛病信息:
在以下办法或属性之间的挪用不明白:“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<int>)”和“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<double>)”
以是我们必需明白数据范例给编译器,以下:
Print((intx,inty)=>x+y);
如许我们的代码就可以编译经由过程了:)
来自:http://www.ckuyun.com/kingthy/archive/2008/04/18/1160483.html
也不知道,我同学昨天说数据挖掘很好。 |
|