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


    在这篇文章中,我们会看到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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
  • 相关阅读:
    此查询使用的不是 ANSI 外部联接运算符
    centos重启命令
    updatePanel 加载完成后回调JS
    建站推荐十个免费的CMS内容管理系统(Php+mysql)
    [转]最值得拥有的免费Bootstrap后台管理模板
    Got a packet bigger than 'max_allowed_packet' bytes”
    ECshop商城程序常见的96个小问题汇总
    linux 命令
    mysql 存储过程
    千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记
  • 原文地址:https://www.cnblogs.com/Henllyee/p/1553192.html
Copyright © 2020-2023  润新知