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

