在这篇文章中,我们会看到C#3.0新特性中的Lambda表达式语法。
示例的引入
首先我们先来回顾下委托(可以看这篇文章来了解委托),首先我们先来定义两个委托:
public delegate bool IsSwap( T ForObject,T LastObject); public delegate void Swap (ref T ForObject,ref T LastObject);
当然在System.Core.dll中已经为我们提供了大量的delegate,比如对于我们自定义的IsSwap可以使用Func<T1,T2,TResult>(T arg1,Targ2)来代替。这两个委托会在我下面的示例中用到,IsSwap是判断是否交换,Swap是实现交换的委托。示例中直接给出了一个函数式编程的数组排序:
public delegate bool IsSwap( T ForObject,T LastObject); public delegate void Swap (ref T ForObject,ref T LastObject); class SortArry { public T[] TargetArry { get; set; } public SortArry() { } /// /// 初始化函数 /// /// 目标数组 public SortArry(T[] Arry) { TargetArry = Arry; } ////// 排序 /// ///public T[] Sort(IsSwap ISSwapHandler,Swap SwapHandler) { var arryT = new T[TargetArry.Length]; arryT = TargetArry; for (int i = 0; i < arryT.Length - 1; i++) { for (int j = 0; j < arryT.Length - i - 1; j++) { if (ISSwapHandler(arryT[j], arryT[j + 1])) { SwapHandler(ref arryT[j], ref arryT[j + 1]); } } } return arryT; } }
用匿名方法来实现
在2.0里面我们可以使用匿名方法来写,无需显示的定义方法,大大的降低了代码量:
static void Main(string[] args) { var TargetIntArray = new int[]{1,2,3,5,4}; var SortObject = new SortArry{ TargetArry = TargetIntArray }; var resultArray = SortObject.Sort( delegate(int i, int j) { return i < j; }, delegate(ref int i, ref int j) { var temp = i; i = j; j = temp; }); foreach (var a in resultArray) { Console.WriteLine(a); } Console.Read(); }
运行结果:
Lambda表达式实现
在C#3.0中我们可以使用一种更为简洁的方式实现--Lambda表达式:
static void Main(string[] args) { var TargetIntArray = new int[]{1,2,3,5,4}; var SortObject = new SortArry{ TargetArry = TargetIntArray }; var resultArray = SortObject.Sort((i, j) => i < j, (ref int i,ref int j) => { var temp = i; i = j; j = temp; }); foreach (var a in resultArray) { Console.WriteLine(a); } Console.Read(); }
在这我们看到了比匿名方法更为简洁的实现,同时可以发现大部分时候我们是不需要提供参数类型,因为编译器可以从方法的签名中推断出参数的类型。
如何编写
我们可以看到在“=>”之前是参数列表,在“=>”之后的是表达式或则语句体。其中右边如果是表达式的话一般叫做“表达式Lambda”,而多条语句组成则叫做“语句Lambda”。
来看多个Lambda形式:
1.隐式类型,表达式方法体:
i=>i+1
2.隐式类型,语句方法体:
i=>{i+1;}
3.显式类型,表达式方法体:
(int i)=>i+1
4.显式类型,语句方法体:
(int i)=>{i+1;}
5.无参数:
()=>Console.WriteLine(“Henllyee”)