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()); } }
學無止境,望各位看官多多指教。