Lambda運算式詳解【轉】

來源:互聯網
上載者:User

標籤:

        1、天真熱,程式員活著不易,星期天,也要頂著火辣辣的太陽,總結這些東西。

        2、誇誇lambda吧:簡化了匿名委託的使用,讓你讓代碼更加簡潔,優雅。據說它是微軟自c#1.0後新增的最重要的功能之一。

lambda簡介

     lambda運算子:所有的lambda運算式都是用新的lambda運算子 " => ",可以叫他,“轉到”或者 “成為”。運算子將運算式分為兩部分,左邊指定輸入參數,右邊是lambda的主體。

        lambda運算式:

               1.一個參數:param=>expr

               2.多個參數:(param-list)=>expr

        上面這些東西,記著,下面我們開始應用並闡述lambda,讓你樂在其中。

lambda應用闡述    

         闡述這技術,我先上一個例子,然後再慢慢深入分析。例子如下:         

namespace 闡述lambda{    public class Person    {        public string Name { get; set; }        public int Age  {  get;set; }        }    class Program    {        public static List<Person> PersonsList()        {            List<Person> persons = new List<Person>();            for (int i = 0; i < 7; i++)            {                Person p = new Person() { Name = i + "兒子", Age = 8 - i, };                persons.Add(p);                            }            return persons;        }        static void Main(string[] args)        {            List<Person> persons = PersonsList();            persons = persons.Where(p => p.Age > 6).ToList();       //所有Age>6的Person的集合            Person per = persons.SingleOrDefault(p => p.Age == 1);  //Age=1的單個people類            persons = persons.Where(p => p.Name.Contains("兒子")).ToList();   //所有Name包含兒子的Person的集合        }    }}

     看啦上面的例子,相信你能看出它確實是個甜棗,呵呵,下面我們來看下(p=>p.Age>6)這樣的運算式,到底是怎麼回事。。

     首先我們看下委託  

        //委託  逛超市        delegate int GuangChaoshi(int a);        static void Main(string[] args)        {            GuangChaoshi gwl = JieZhang;            Console.WriteLine(gwl(10) + "");   //列印20,委託的應用            Console.ReadKey();        }                //結賬        public static int JieZhang(int a)        {            return a + 10;        }

    再看錶達式

        //委託  逛超市        delegate int GuangChaoshi(int a);        static void Main(string[] args)        {                     // GuangChaoshi gwl = JieZhang;            GuangChaoshi gwl = p => p + 10;            Console.WriteLine(gwl(10) + "");   //列印20,運算式的應用            Console.ReadKey();        }               

     委託跟運算式的兩段代碼,我們可以看出一些東東吧:其實運算式(p => p + 10;)中的 p 就代表委託方法中的參數,而運算式符號右邊的 p+10,就是委託方法中的返回結果。 大俠繞道,小蝦理解下。

    下面再上兩個稍微複雜點的理解理解。

    1.多參數的 

        //委託  逛超市        delegate int GuangChaoshi(int a,int b);        static void Main(string[] args)        {                        GuangChaoshi gwl = (p,z) => z-(p + 10);            Console.WriteLine(gwl(10,100) + "");   //列印80,z對應參數b,p對應參數a            Console.ReadKey();        }

        2. lambda主體運算複雜  

        /// <summary>        /// 委託  逛超市        /// </summary>        /// <param name="a">花費</param>        /// <param name="b">付錢</param>        /// <returns>找零</returns>        delegate int GuangChaoshi(int a,int b);        static void Main(string[] args)        {            GuangChaoshi gwl = (p, z) =>            {                int zuidixiaofei = 10;                if (p < zuidixiaofei)                {                    return 100;                }                else                {                    return z - p - 10;                }                       };            Console.WriteLine(gwl(10,100) + "");   //列印80,z對應參數b,p對應參數a            Console.ReadKey();        }

上面這些例子,好好理解下,下面我要介紹一個系統指定的 Fun<T>委託。

Func<T>委託

 T 是參數類型,這是一個泛型型別的委託,用起來很方便的。

 先上例子

  static void Main(string[] args)        {            Func<int, string> gwl = p => p + 10 + "--傳回型別為string";                        Console.WriteLine(gwl(10) + "");   //列印‘20--傳回型別為string’,z對應參數b,p對應參數a            Console.ReadKey();        }

說明:我們可以看到,這裡的p為int 型別參數, 然而lambda主體返回的是string類型的。

再上一個例子

        static void Main(string[] args)        {            Func<int, int, bool> gwl = (p, j) =>                {                    if (p + j == 10)                    {                        return true;                    }                    return false;                };            Console.WriteLine(gwl(5,5) + "");   //列印‘True’,z對應參數b,p對應參數a            Console.ReadKey();        }

說明:從這個例子,我們能看到,p為int類型,j為int類型,傳回值為bool類型。

看完上面兩個例子,相信大家應該明白啦Func<T>的用法:多個參數,前面的為委託方法的參數,最後一個參數,為委託方法的傳回型別。

 lambda運算式樹狀架構動態建立方法  
   static void Main(string[] args)        {            //i*j+w*x            ParameterExpression a = Expression.Parameter(typeof(int),"i");   //建立一個運算式樹狀架構中的參數,作為一個節點,這裡是最下層的節點            ParameterExpression b = Expression.Parameter(typeof(int),"j");            BinaryExpression be = Expression.Multiply(a,b);    //這裡i*j,產生運算式樹狀架構中的一個節點,比上面節點高一級            ParameterExpression c = Expression.Parameter(typeof(int), "w");            ParameterExpression d = Expression.Parameter(typeof(int), "x");            BinaryExpression be1 = Expression.Multiply(c, d);            BinaryExpression su = Expression.Add(be,be1);   //運算兩個中級節點,產生終結點            Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(su,a,b,c,d);            Console.WriteLine(lambda + "");   //列印‘(i,j,w,x)=>((i*j)+(w*x))’,z對應參數b,p對應參數a            Func<int, int, int, int, int> f= lambda.Compile();  //將運算式樹狀架構描述的lambda運算式,編譯為可執行代碼,並產生該lambda運算式的委託;            Console.WriteLine(f(1, 1, 1, 1) + "");  //列印2            Console.ReadKey();        }

 

這段代碼,放上來,仔細理解下,理解透徹啦,lambda運算式基本上也沒什麼啦。呵呵。。

算啦,我還是畫個圖算是結尾吧,以便於理解。

上段代碼的lambda運算式樹狀架構,圖。

 

 

 

 

Lambda運算式詳解【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.