Lambda表達式只是用更簡單的方式來寫匿名方法,徹底簡化了對.NET委托類型的使用。
現在,如果我們要使用泛型 List<> 的 FindAll() 方法,當你從一個集合去提取子集時,可以使用該方法。
// 該方法唯一的參數是一個System.Predicate<T>類型的泛型委托 public List<T> FindAll(Predicate<T> match); // 該委托指向任意以類型參數作為唯一輸入參數並返回bool的方法 public delegate bool Predicate<in T>(T obj);
在調用 FindAll() 時,List<T>中每一項都將傳入Predicate<T> 對象所指向的方法。方法在實現時將執行一些計算,來判斷傳入的數據是否符合標准,並返回 true / false,如果返回 true ,該項被添加到表示自己的List<T>集合中。
現在,我們需要從一個List<int>集合中找到所有偶數,該如何實現呢?
1.傳統方法
public class MyDelegateSyntax
{public static void Show()
{
Console.WriteLine("fun with lambdas");
List<int> list = new List<int> { 20, 1, 4, 8, 9, 77 };
Predicate<int> callback = new Predicate<int>(IsEvenNumber);
// 傳統方法
List<int> evenList = list.FindAll(callback);
Console.WriteLine();
foreach (int item in evenList)
{
Console.WriteLine(item);
}
}
private static bool IsEvenNumber(int obj) => obj % 2 == 0;
}
2.匿名方法
public class MyDelegateSyntax
{
public static void Show()
{
Console.WriteLine("fun with lambdas");
List<int> list = new List<int> { 20, 1, 4, 8, 9, 77 };
// 匿名方法
List<int> evenList = list.FindAll(delegate (int i)
{
return i % 2 == 0;
});
Console.WriteLine();
foreach (int item in evenList)
{
Console.WriteLine(item);
}
}
}
3.Lambda表達式
public class MyDelegateSyntax
{
public static void Show()
{
Console.WriteLine("fun with lambdas");
List<int> list = new List<int> { 20, 1, 4, 8, 9, 77 };
// Lambda表達式
// 隱式,編輯器會更具上下文表達式推斷i的類型
List<int> evenList = list.FindAll(i => i % 2 == 0);
// 顯式
// 描述:我的參數列表(一個整形i)將會被表達式(i%2)==0處理
List<int> evenList1 = list.FindAll((int i) => i % 2 == 0);
// 我的參數列表(一個整形i)將會被表達式(i%2)==0處理
Console.WriteLine();
foreach (int item in evenList)
{
Console.WriteLine(item);
}
}
}
4.使用多個語句處理參數(“{}”)
public class MyDelegateSyntax
{
public static void Show()
{
Console.WriteLine("fun with lambdas");
List<int> list = new List<int> { 20, 1, 4, 8, 9, 77 };
// 多個處理語句 語句塊 {}
List<int> evenList = list.FindAll(i =>
{
Console.WriteLine(i);
return i % 2 == 0;
});
Console.WriteLine();
foreach (int item in evenList)
{
Console.WriteLine(item);
}
}
}
5.含有多個(或零個)參數的Lambda表達式
public class MyDelegateSyntax
{
public delegate string VerySimpleDelegate();
public delegate void MathMessage(string msg, int result);
public static void Show()
{
Console.WriteLine("fun with lambdas");
// 多個參數的Lambda
MathMessage mm = new MathMessage((msg, result) => Console.WriteLine($"msg:{msg} result:{result}"));
mm("adding has cmpleted", 1 + 5);
// 0個參數Lambda
VerySimpleDelegate d = new VerySimpleDelegate(() => "enjoy you string");
Console.WriteLine(d.Invoke());
}
}
學無止境,望各位看官多多指教。