程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Lambda表達式詳解

Lambda表達式詳解

編輯:C#入門知識

前言

        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表達式樹,圖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved