1. 程式人生 > >C# Lambda表示式

C# Lambda表示式

上一節中,我們講到:在 2.0 之前的 C# 版本中,宣告委託的唯一方法是使用命名方法。  C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表示式取代了匿名方法,作為編寫內聯程式碼的首選方式  有一種情況下,匿名方法提供了 Lambda 表示式中所沒有的功能。  您可使用匿名方法來忽略引數列表。  這意味著匿名方法可轉換為具有各種簽名的委託。  這對於 Lambda 表示式來說是不可能的。  

    總結下紅色那段話的意思:微軟告訴你:我們在C#2.0之前就有委託了,在2.0之後又引入了匿名方法,C#3.0之後,又引入了Lambda表示式,他們三者之間的順序是:委託->匿名錶達式->Lambda表示式,微軟的一步步升級,帶給我們程式設計上的優美,簡潔,可讀性強.....在此,不多誇微軟,怕他們看到這篇部落格後驕傲,怕他們尾巴能翹到天上,不知天高地厚。嘿嘿,說多了!

    溫故而知新,可以做老師,咱們來溫故下委託和匿名錶達式。

委託如下:

複製程式碼
 delegate int calculator(int x, int y); //委託型別
        static void Main()
        {
            calculator cal = new calculator(Adding);
            int He = cal(1, 1);
            Console.Write(He);
        }

        /// <summary>
        /// 加法
        /// </summary>
/// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public static int Adding(int x, int y) { return x + y; }
複製程式碼

匿名方法如下:

複製程式碼
 delegate int calculator(int x, int y); //委託
        static void Main()
        {
            calculator cal 
= delegate(int num1,int num2) { return num1 + num2; }; int he = cal(1, 1); Console.Write(he); }
複製程式碼

下面我們來講解Lambda表示式:

 按照上邊的加法,我們用Lambda表示式來實現,程式碼如下:

複製程式碼
delegate int calculator(int x, int y); //委託型別
        static void Main()
        {
            calculator cal = (x, y) => x + y;//Lambda表示式,大家發現沒有,程式碼一個比一個簡潔
            int he = cal(1, 1);
            Console.Write(he);
        }
複製程式碼

那麼我們詳細講講Lambda表示式:

若要建立 Lambda 表示式,需要在 Lambda 運算子 => 左側指定輸入引數(如果有),然後在另一側輸入表示式或語句塊。 例如,lambda 表示式 x => x * x 指定名為 x 的引數並返回 x 的平方值。 如上面的示例所示,你可以將此表示式分配給委託型別

"Lambda表示式"是一個特殊的匿名函式,是一種高效的類似於函數語言程式設計的表示式,Lambda簡化了開發中需要編寫的程式碼量。它可以包含表示式和語句,並且可用於建立委託或表示式目錄樹型別,支援帶有可繫結到委託或表示式樹的輸入引數的內聯表示式。所有Lambda表示式都使用Lambda運算子=>,該運算子讀作"goes to"。Lambda運算子的左邊是輸入引數(如果有),右邊是表示式或語句塊。Lambda表示式x => x * x讀作"x goes to x times x"。舉幾個簡單的Lambda表示式,如下:

複製程式碼
delegate bool MyBol(int x, int y);
        delegate bool MyBol_2(int x, string y);
        delegate int calculator(int x, int y); //委託型別
        delegate void VS();
        static void Main()
        {
            MyBol Bol = (x, y) => x == y;
            MyBol_2 Bol_2 = (x, s) => s.Length > x;
            calculator C = (X, Y) => X * Y;
            VS S = () => Console.Write("我是無引數Labada表示式");
            //
            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
            int oddNumbers = numbers.Count(n => n % 2 == 1);
            //
            List<People> people = LoadData();//初始化
            IEnumerable<People> results = people.Where(delegate(People p) { return p.age > 20; });
        }

        private static List<People> LoadData()
        {
            List<People> people = new List<People>();   //建立泛型物件  
            People p1 = new People(21, "guojing");       //建立一個物件  
            People p2 = new People(21, "wujunmin");     //建立一個物件  
            People p3 = new People(20, "muqing");       //建立一個物件  
            People p4 = new People(23, "lupan");        //建立一個物件  
            people.Add(p1);                     //新增一個物件  
            people.Add(p2);                     //新增一個物件  
            people.Add(p3);                     //新增一個物件  
            people.Add(p4);
            return people;
        }

    }

    public class People
    {
        public int age { get; set; }                //設定屬性  
        public string name { get; set; }            //設定屬性  
        public People(int age, string name)      //設定屬性(建構函式構造)  
        {
            this.age = age;                 //初始化屬性值age  
            this.name = name;               //初始化屬性值name  
        }
    } 
複製程式碼

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型別。

至此,如果上邊的內容都能看懂,那麼Lambda也就沒什麼了!

原文連結:https://www.cnblogs.com/chenwolong/p/5669440.html

相關推薦

C++ lambda表示式總結

    一個lambda表示式用於建立閉包。lambda表示式與任何函式類似,具有返回型別、引數列表和函式體。與函式不同的是,lambda能定義在函式內部。lambda表示式具有如下形式 [ capture list ] ( parameter list) -> r

使用ES6新陣列方法(象C# Lambda表示式一樣寫查詢語句)

let people = [ {id: 1, name: "a", age: 12}, {id: 2, name: "b", age: 13}, {id: 3, name: "c", age: 14}, {id: 4, name: "d", age: 15}

C++ lambda表示式

1. lambda表示概念 可將lambda表示式視為包含公有operator()的匿名結構(或類),從這種意義上說,lambda表示式屬於函式物件。從上面所講到的進行分析: for_each(vectorElement.begin(), vectorElement.en

c++ lambda表示式常用的情形

lambda表示式介紹 懶,摘自msdn Capture 子句(在 C++ 規範中也稱為 lambda 引導。) 引數列表(可選)。 (也稱為 lambda 宣告符) 可變規範(可選)。 異常規

C++ lambda表示式入門

1.lambda表示式 lambda表示式 是一個函式,一個匿名函式,也就是沒有函式名的函式,為什麼不需要函式名呢,因為我們直接(一次性的)用它,嵌入式用的它,不需要其他地方用它。 也叫閉包,閉就是封閉的意思,就是其他地方都不用他,包就是函式。 lambda表示

C++ lambda表示式一個非常簡單的例子

如果我想要定義一個指向int為返回值,兩個int為引數的函式的指標,有兩種方法1: 先宣告一個函式int func(int, int);然後使用decltype推斷這個func的型別作為新定義的型別的型別typedef decltype(func) * Func1;2: 直接

C#Lambda表示式

需求 有時候我們需要傳遞一個很方法的引用,我們很確定這個方法僅僅會呼叫這一次,單獨為它建立一個方法感覺有些浪費,但是又必須用到這個方法。又或者臨時需要一個方法,但是思考半天想不出該給這個方法取什麼名字(有過這個經歷的同學握個爪)。這個時候Lambda就派上用場

C# Lambda表示式詳細總結

(一)輸入引數 在Lambda表示式中,輸入引數是Lambda運算子的左邊部分。它包含引數的數量可以為0、1或者多個。只有當輸入引數為1時,Lambda表示式左邊的一對小括弧才可以省略。輸入引數的數量大於或者等於2時,Lambda表示式左邊的一對小括弧中的多個引

C# => Lambda表示式理解

本文參考網上的部落格和找到的資料加上個人理解編寫的,主要的程式碼借鑑:http://www.cnblogs.com/knowledgesea/p/3163725.html、百度百科 希望能夠幫助理解l

C# Lambda表示式詳細

(一)輸入引數 在Lambda表示式中,輸入引數是Lambda運算子的左邊部分。它包含引數的數量可以為0、1或者多個。只有當輸入引數為1時,Lambda表示式左邊的一對小括弧才可以省略。輸入引數的數量大於或者等於2時,Lambda表示式左邊的一對小括弧中的多個引

學習C++——lambda表示式

上面三個是C++學習網站,有助於瞭解C++11的新特性。 lambda表示式(C++11) 1、介紹lambda 我們使用過的僅有兩種可呼叫物件是函式和函式指標。還有其他兩種可呼叫物件:過載了函式呼叫運算子的類,以及lambda表示式。 一個lambda表示式表示一個

C++ lambda 表示式傳遞的變數預設不可變

我遇到如下問題: int count=0; listener->onTouchMoved=[count](Touch* t,Event* e){ count++; log("onTouchMoved");

C++ lambda表示式的編譯器實現..

 現在,Android已經全面轉向C++11/14標準了,看程式碼的話,很多地方變化很大,新標準真的是有點顛覆性的,感覺已經不會C++了。今天有看到lambda表示式,突然想看一下,這貨是怎麼實現的,如下,寫了個例子,分別呼叫3個lambda表示式: #include

C# Lambda表示式

上一節中,我們講到:在 2.0 之前的 C# 版本中,宣告委託的唯一方法是使用命名方法。  C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表示式取代了匿名方法,作為編寫內聯程式碼的首選方式。  有一種情況下,匿名方法提供了 Lambda 表示式

c++ lambda表示式(匿名函式)的使用總結

#include <iostream> using namespace std; //[=] () mutable throw() -> int {} /** * lambda expression * “Lambda 表示式”(lambda exp

C#lambda表示式和匿名函式

lambda表示式也被稱為匿名函式,何為匿名函式? 匿名沒有真實名字,當然在C#中就是沒有函式名了,C#裡有兩種匿名函式的寫法,一種是早期推出的匿名函式,而另一種就是拉姆達(lambda)表示式了,那麼這兩種有什麼不同,分別怎麼用的,下面介紹一下. 我個人覺得吧,在寫程式碼

c++ lambda表示式捕獲變數引數

[]不捕獲任何變數 [&]捕獲外部作用域中所有變數,並作為引用在函式體重使用 [=]捕獲外部作用域中所有變數,並作為副本在函式體重使用 [=,&foo]捕獲外部作用域中所有變數,並作為副本在函式體重使用,對於foo按引用捕獲 [foo]當作副本捕獲foo,不

C# -- lambda表示式轉為where條件sql語句的方法

原文轉至:http://www.cnblogs.com/FengCodes/p/LambdaToSqlWhere.html 有更改 /// <summary> /// 根據Expression表示式生成SQL-Where部分的語句 /// <

C++11】Lambda表示式

    C++11的一大亮點就是引入了Lambda表示式。利用Lambda表示式,可以方便的定義和建立匿名函式。對於C++這門語言來說來說,“Lambda表示式”或“匿名函式”這些概念聽起來好像很深奧,但很多高階語言在很早以前就已經提供了Lambda表示式的功能,如C#,Pyth

[effective modern c++ 學習筆記] Lambda 表示式 徹底拋棄bind

要點總結 <1> lambda基本形式 [捕獲列表](形參表){函式體} std::find_if(container.begin(), container.end(),[](int val) { return 0 < val && val <