zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
  • 相关阅读:
    SAP OPEN UI5 Step 8: Translatable Texts
    SAP OPEN UI5 Step7 JSON Model
    SAP OPEN UI5 Step6 Modules
    SAP OPEN UI5 Step5 Controllers
    SAP OPEN UI5 Step4 Xml View
    SAP OPEN UI5 Step3 Controls
    SAP OPEN UI5 Step2 Bootstrap
    SAP OPEN UI5 Step1 环境安装和hello world
    2021php最新composer的使用攻略
    Php使用gzdeflate和ZLIB_ENCODING_DEFLATE结果gzinflate报data error
  • 原文地址:https://www.cnblogs.com/Henllyee/p/1553192.html
Copyright © 2011-2022 走看看