Lambda
什么是Lambda表達式
- 簡單來說释涛,編程中提到的 lambda 表達式,通常是在需要一個函數(shù)倦沧,但是又不想費神去命名一個函數(shù)的場合下使用唇撬,也就是指匿名函數(shù)。
- 可以使用委托對象調用可由委托引用的方法展融,提供了一種傳遞代碼塊作為委托參數(shù)的技術窖认。匿名方法是沒有名稱只有主體的方法。
- 在Lambda中您不需要指定返回類型,它是從方法主體內(nèi)的 return 語句推斷的扑浸。
如何使用Lambda表達式
一. Lambda表達式的由來:
- 基于委托創(chuàng)建Lambda表達式 以下代碼將表述從 匿名函數(shù)—>最簡化的Lambda 表達式的過程:
public delegate void NoReturnWithPara(int x,int y); //創(chuàng)建一個委托
class MyLamda
{
public static void Show()
{
NoReturnWithPara method0 = new NoReturnWithPara(ShowSomething); //將委托綁定方法
/*創(chuàng)建一個匿名函數(shù) 即 在實例化委托對象的時候 將函數(shù)內(nèi)容寫入初始化中*/
NoReturnWithPara method2 = new NoReturnWithPara(
delegate (int x, int y) //匿名方法
{
/*方法體*/
Console.WriteLine("delegate");
}
);
/*創(chuàng)建一個初始版Lambda表達式 優(yōu)化上例部分內(nèi)容 即 去除上例中 delegate關鍵字 改為 最后加入 => 符號*/
NoReturnWithPara method3 = new NoReturnWithPara(
(int x, int y) => //初形 Lambda
{
/*方法體*/
Console.WriteLine("delegate");
}
);
/*完整的 Lambda 出現(xiàn) 即 優(yōu)化參數(shù)列表 參數(shù)類型不必明確聲明 類型根據(jù)當前委托的參數(shù)類型 去除new實例過程*/
NoReturnWithPara method4 =
(x, y) => //參數(shù)列表 參數(shù)類型可以去除
{
/*方法體*/
Console.WriteLine("delegate");
};
/*優(yōu)化上例部分內(nèi)容 即 去除了{}烧给,但是方法體只能有一行內(nèi)容*/
NoReturnWithPara method5 = new NoReturnWithPara(
(x, y) =>
/*方法體 一行*/
Console.WriteLine("delegate")
);
/*終極優(yōu)化 方法體只能一行 ----- 類似簡寫委托 即 取消實例化 new過程 */
NoReturnWithPara method6 = (x, y) => /*方法體 一行*/ Console.WriteLine("delegate");
}
static void ShowSomething(int x, int y)
{
Console.WriteLine("ShowSomeThing");
}
}
如上 是帶有參數(shù)的委托的Lambda表達式簡化形式。還有另外一些寫法就不一一闡述了喝噪。
- 以下寫一個有參數(shù) 有返回值的Lambda寫法
public delegate int WithReturnNoPara(int x);
class MyLamda
{
public static void Show()
{
WithReturnNoPara method11 =
(int a) =>
{
return a;
};
Console.WriteLine(method11(5));
//只有一個參數(shù)時 不需要括號 當只有一條方法體 返回數(shù)據(jù)無需 return 修飾
WithReturnNoPara method10 = x => x;
Console.WriteLine(method10(5));
}
}
如上 會打印得到值 5 如此為有參數(shù)又返回值的Lambda表達式
二.系統(tǒng)自帶委托 Action Func的Lambda
- Action 無返回值類型
class MyLamda
{
public static void Show()
{
//一個系統(tǒng)自定義的委托
Action act1 = () => { Console.WriteLine("act1"); }; //無參 無返 lamda
act1();
//最多可以接受 16個參數(shù) 的委托 础嫡,有參 無返
Action<string, int> act2 = (x, y) => { Console.WriteLine(x + "+" + y); };
act2("a", 5);
Action<string, int> act3 = (x, y) => Console.WriteLine("x + y"); //去掉{} 但只能寫一句方法體
}
}
- Func 有返回值類型
class MyLamda
{
public static void Show()
{
//無參 有返回值 如此 返回2 返回值為唯一的<>中的類型 詳情F12
Func<int> fun1 = () => 2;
Console.WriteLine(fun1()); //返回值為2
//有參 有返回值 如此 返回“abc” 返回值為<>中最后一個輸入的類型 前三個為()中參數(shù)類型 最多16個參數(shù) 詳情F12
Func<int,double,string,string> fun2 = (x,y,z) => "abc";
Console.WriteLine(fun2(2, 2, "2")); //結果為 abc
}
}
三.將函數(shù)當做參數(shù)傳遞
在開發(fā)中遇到需要將函數(shù)內(nèi)容 當做參數(shù)傳遞的 也可使用這種方法傳遞 借助委托的Lambda
class MyLamda
{
public static void Show()
{
ShowSomething4(() => { Console.WriteLine("ShowSomething4"); }); //Action
ShowSomething4((x,y) => {return "ShowSomething4"; }); //Func
}
static void ShowSomething4(Action function)
{
function();
}
static void ShowSomething4(Func<int,int,string> function)
{
Console.WriteLine(function(5, 5));
}
}