天天看點

.net進階技術——lambda表達式

自C#3.0開始,就可以使用一種新文法把實作代碼賦予委托:lambda表達式。隻要有委托參數類型的部分,就可以使用Lambda表達式。

下面先來看幾個例子

static void Main(string[] args)
        {
            Action<int> a1 = delegate (int n) { n = n + 1; };//最原始的寫法
            Action<int> a2 =  (int n)=>{ n = n + 1; };//進行第一步改造,可以删除delegate 然後在int n後面使用=>,讀作goes to
            Action<int> a3 = (n) => { n = n + 1; };//進行第二步改造,可以删除類型,因為類型可以由前面推斷出來
            Action<int> a4 = n => { n = n + 1; };//進行第二步改造,由于隻有一個參數,是以連括号也可以删除,這就是這個匿名委托最簡單的方式

            //第二個例子
            Func<int,string,int> f1 = delegate (int n,string s) { return n; };//這是最原始的寫法
            Func<int,string,int> f2 = (int n,string s)=>{ return n; };//進行第一步改造,删除delegate,加入=>符号
            Func<int,string,int> f3 = ( n, s)=>{ return n; };//删除類型
            //Func<int,string,int> f4 =  n, s=>{ return n; };//由于有多個參數,是以不能删除括号,否則會報錯
            Func<int,string,int> f4 = ( n, s)=> n;//如果方法體隻有一句代碼且是傳回值代碼,那麼可以省去return和{},這個就是最簡的方式


        }
           

使用反編譯器檢視到的代碼

.net進階技術——lambda表達式

通過上面的例子示範了有傳回值和無傳回值,單個參數與多個參數的例子,我們來總結下lambda表達式的用法以及規則

1.可以省去delegate關鍵字

2.可以省去參數類型

3.如果隻有一個參數,可以省去括号

4.如果方法有傳回值,且方法隻有一句代碼,這句代碼還是傳回值代碼,那麼就可以省去return和{},直接寫要傳回的值就可以了

下面通過例子來練習下Lambda表達式

Func<int, string> f5 = delegate (int n) { return "你好" + n; };
            Console.WriteLine(f5(4));
            Console.ReadKey();
           

對上面例子進行簡化代碼

Func<int, string> f6 = (int n) => { return "你好" + n; };
            Func<int, string> f7 = (n) => { return "你好" + n; };
            Func<int, string> f8 = n => { return "你好" + n; };
            Func<int, string> f9 = n => "你好" + n;
           

最終可以簡化成f9這個樣子

下面再來一個例子

Func<int, string> n1 = n => "你能反推回去嗎???"+n;
            Console.WriteLine(n1(1));
           

下面是推導過程

//第四個例子
            Func<int, string> n1 = n => "你能反推回去嗎???" + n;
            Func<int, string> n2 = n => { return "你能反推回去嗎???" + n; };
            Func<int, string> n3 = (n) => { return "你能反推回去嗎???" + n; };
            Func<int, string> n4 = (int n) => { return "你能反推回去嗎???" + n; };
            Func<int, string> n5 = delegate(int n){ return "你能反推回去嗎???" + n; };
            Console.WriteLine(n1(1));
            Console.ReadKey();
           

下面我們來改造下之前寫的GetMax方法

delegate bool CompareNum(object obj1, object obj2);

    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 1, 2, 23, 321, 124, 24321, 214 };
            //Func<object, object, bool> cpn = delegate (object obj1, object obj2)
            //{
            //    int i1 = (int)obj1;
            //    int i2 = (int)obj2;
            //    return i1 > i2;
            //};
            //Func<int, int, bool> f1 = delegate (int n1, int n2) { return n1 > n2; };
            //Func<int, int, bool> f1 =  (int n1, int n2)=>{ return n1 > n2; };
            //Func<int, int, bool> f1 =  ( n1,  n2)=>{ return n1 > n2; };
            //Func<int, int, bool> f1 = (n1, n2) => n1 > n2;
            //int max = (int)GetMax(nums, f1);
            //Console.WriteLine(max);

            //對Person的age進行比較
            Person[] p1 = new Person[] { new Person() { Age = 12, Name = "張三" }, new Person() { Age = 22, Name = "曆史" }, new Person() { Age = 23, Name = "王五" } };
            Func<Person, Person, bool> f2 = (n1, n2) => n1.Age > n2.Age;
            Person max = (Person)GetMax<Person>(p1, f2);
            Console.WriteLine(max.ToString());
            Console.ReadKey();
        }
        static T GetMax<T>(T[] obj, Func<T, T, bool> f1)
        {
            T max = obj[0];
            for (int i = 1; i < obj.Length; i++)
            {
                if (!f1(max, obj[i]))
                {
                    max = obj[i];
                }
            }
            return max;
        }
    }
    public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public override string ToString()
        {
            return "姓名是:" + Name + ",年齡是" + Age;
        }
    }
           

現在上面我們建立一個比較整型的委托,還有一個比較人的年齡的委托,這樣寫起來十分舒适,十分簡單。隻需要一句代碼就能搞定了!!!

---本部落格是學習以後記錄知識,如有侵權,請聯系删除!!!!

繼續閱讀