C# Lambda表達(dá)式select()和where()的區(qū)別及用法
C# Lambda表達(dá)式select()和where()的區(qū)別
1、where()用法:必須加條件,且返回對(duì)象結(jié)果。
string[] arrays={"asd","abc","bbb","ccc"}; var results = arrays.Where(a=>a.Contains("b"));//必須加條件,返回對(duì)象
2、select()用法:(1)(a=>a.Value=="22")加條件查詢時(shí),返回bool型結(jié)果;(2)(a=>a)沒條件返回對(duì)象
string[] arrays={"asd","abc","bbb","ccc"}; var results = arrays.Select(a => a.Contains("b"));//1、(a=>a.Value=="22")加條件查詢時(shí),返回bool型結(jié)果
string[] arrays={"asd","abc","bbb","ccc"}; var results = arrays.Select(a => a);//1、(a=>a)沒條件,返回所有對(duì)象;
結(jié)論:
select在linq中一般會(huì)用來提取最后篩選的元素集合,在lambda表達(dá)式中通常用where得到元素集合
C# Lambda表達(dá)式
前言
在日常使用C#編程的過程中,會(huì)經(jīng)常使用到lambda表達(dá)式,本文將會(huì)詳細(xì)講解Lambda表達(dá)式。
1 認(rèn)識(shí)Lambda表達(dá)式
- Lambda表達(dá)式本質(zhì)上就是匿名函數(shù)
- 使用lambda聲明運(yùn)算符 =>(讀作goesto)的表達(dá)式就是Lambda表達(dá)式
- 創(chuàng)建Lambda表達(dá)式,需要在 Lambda 運(yùn)算符左側(cè)指定輸入?yún)?shù)(如果有),然后在另一側(cè)輸入表達(dá)式或語句塊。即是說我們使用形如 ()=> { } 這樣的格式就可以創(chuàng)建Lambda表達(dá)式
- 任何 Lambda 表達(dá)式都可以轉(zhuǎn)換為委托類型。 Lambda 表達(dá)式可以轉(zhuǎn)換的委托類型由其參數(shù)和返回值的類型定義。 如果 Lambda 表達(dá)式不返回值,則可以將其轉(zhuǎn)換為 Action 委托類型之一;否則,可將其轉(zhuǎn)換為 Func 委托類型之一。
正因?yàn)槿魏?Lambda表達(dá)式都可以轉(zhuǎn)換為委托類型,那么在需要使用委托的地方都可以結(jié)合Lambda使用,極大的方便了委托的使用和提高代碼的簡(jiǎn)潔度。
- Lambda表示式的兩種方式
表達(dá)式lambda,表達(dá)式為主體【側(cè)重表達(dá)式的返回值】
(input-parameters) => expression //如: x => x * 4
語句 lambda,語句塊作為其主體:【側(cè)重語句塊中執(zhí)行內(nèi)容】
(input-parameters) => { <sequence-of-statements> } //如: (int x) => { return x * 2; };
表達(dá)式位于=>運(yùn)算符右側(cè)的lambda表達(dá)式稱之為“表達(dá)式Lambda”。
表達(dá)式Lambda會(huì)返回表達(dá)式的結(jié)果
表達(dá)式Lambda的主體可以包含方法的調(diào)用
表達(dá)式Lambda案例如下:
public class LambdaTest { public void Test() { //表達(dá)式lambda 只有一個(gè)表達(dá)式,表示這里面只允許有一行代碼 Func<int, int> func = x => x * 4; //接收表達(dá)式Lambda返回的值 int result1 = func(5); //在表達(dá)式lambda中調(diào)用方法 func = x => x * Add(3, 2); int result2 = func(5); } public int Add(int x,int y) { return x + y; } }
上述代碼中, x=>x * 4 等同于,本質(zhì)上還是一個(gè)將一個(gè)有返回值的方法賦予了Func委托此處還有一個(gè)需要注意的地方就是,Lambda表示式省略了方法中的return 關(guān)鍵字,直接將表達(dá)式中計(jì)算的結(jié)果返回
public int FourX(int number) { return number * 4; }
語句Lambda和表達(dá)式Lambda類似,也是位于=>運(yùn)算符右側(cè),只是語句在大括號(hào)中。語句Lambda的主體可以包括任意數(shù)量的語句,但是通常上不會(huì)多于2個(gè)或3個(gè)。不能使用語句Lambda創(chuàng)建表達(dá)式樹
Action<int> action = (x) => { Console.WriteLine(x); }; action = (y) => { y *= 4; Console.WriteLine(y); };
2 Lambda表達(dá)式的輸入?yún)?shù)
1)將 lambda 表達(dá)式的輸入?yún)?shù)括在括號(hào)中。 使用空括號(hào)指定零個(gè)輸入?yún)?shù)
如果是沒有參數(shù),必須有這個(gè)空括號(hào)
Action line = () => Console.WriteLine();
2)如果 lambda 表達(dá)式只有一個(gè)輸入?yún)?shù),則括號(hào)是可選的:
如果只有一個(gè)輸入?yún)?shù),則括號(hào)可有可無
Func<double, double> cube = x => x * x * x;
3)兩個(gè)或更多輸入?yún)?shù)使用逗號(hào)加以分隔:
Func<int, int, bool> testForEquality = (x, y) => x == y;
4)有時(shí),編譯器無法推斷輸入?yún)?shù)的類型。 可以顯式指定類型,如下面的示例所示:
一般情況下,編譯器可自行推斷輸入?yún)?shù)的類型,但存在編譯器無法推斷的情況,則需自行指定。
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
3 從Lambda表達(dá)式的發(fā)展理解其使用
public delegate void ShowDelegate(int a,string b); public class LambdaEvolution { public void Show(int a1,string b1) { Console.WriteLine($"show{a1}:{b1}"); } public void Test() { //1 .Netframework1.0/1.1,原始方法 ShowDelegate showDelegate = new ShowDelegate(Show); //2 .NetFramework2.0,匿名方法,增加delegate,去掉單獨(dú)定義方法 showDelegate = delegate (int x,string y) { Console.WriteLine($"show{x}:{y}"); }; //3 .NetFramework3.0,=> 引入Lambda表達(dá)式,去掉delegate showDelegate = (int s,string t) => { Console.WriteLine($"show{s}:{t}"); }; //4 .NetFramework3.0后期,簡(jiǎn)化參數(shù)類型,編譯器自動(dòng)推斷數(shù)據(jù)類型 showDelegate = (s,t) => { Console.WriteLine($"show{s}:{t}"); }; //5 如果方法體中只有一行代碼,可以省略方法體大括號(hào) showDelegate = (s,t) => Console.WriteLine($"show{s}:{t}"); //如果方法只有一個(gè)參數(shù),可以省略參數(shù)小括號(hào) Action<string> action = x => Console.WriteLine($"show{x}"); //如果方法體中只有一行代碼,且有返回值,可以省略return Func<int, string> func = x => x.ToString(); } }
總結(jié)
以上就是今天要講的內(nèi)容,本文僅僅簡(jiǎn)單介紹了Lambda的基本使用,而Lambda還有和表達(dá)式樹,LINQ,異步Lambda等知識(shí),會(huì)在后續(xù)進(jìn)行完善
參考資料:
到此這篇關(guān)于C# Lambda表達(dá)式select()和where()的區(qū)別及用法的文章就介紹到這了,更多相關(guān)C# Lambda表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#如何將枚舉以下拉數(shù)據(jù)源的形式返回給前端
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)將枚舉以下拉數(shù)據(jù)源的形式返回給前端,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06基于C#實(shí)現(xiàn)12306的動(dòng)態(tài)驗(yàn)證碼變成靜態(tài)驗(yàn)證碼的方法
這篇文章主要介紹了基于C#實(shí)現(xiàn)12306的動(dòng)態(tài)驗(yàn)證碼變成靜態(tài)驗(yàn)證碼的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12C#中的Hangfire和Quartz.NET 任務(wù)調(diào)度的區(qū)別解析
Hangfire 和 Quartz.NET 是兩種常見的 C# 任務(wù)調(diào)度庫,它們有不同的特點(diǎn)和使用場(chǎng)景,本文給大家介紹C#中的Hangfire和Quartz.NET 任務(wù)調(diào)度的區(qū)別,感興趣的朋友一起看看吧2024-08-08c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景
這篇文章主要給大家介紹了關(guān)于c#中單例類與靜態(tài)類的區(qū)別以及使用場(chǎng)景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C#實(shí)現(xiàn)簡(jiǎn)單的天氣預(yù)報(bào)示例代碼
這篇文章主要介紹了C#實(shí)現(xiàn)簡(jiǎn)單的天氣預(yù)報(bào)示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06