代码改变世界

C#3.0笔记(五)Lambda表达式

2009-08-24 21:42  Henry Cui  阅读(468)  评论(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();
        }

运行结果:

image

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”)

 

作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。