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 <