C#3.0笔记(五)Lambda表达式
2009-08-24 21:42 Henry Cui 阅读(486) 评论(1) 收藏 举报在这篇文章中,我们会看到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”)
浙公网安备 33010602011771号