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