Predicate
Predicate泛型委托:表示定義一組條件並確定指定對象是否符合這些條件的方法。此委托由 Array 和 List 類的幾種方法使用,用於在集合中搜索元素。
通過查看源碼發現

Predicate Array
先來看一下Array.FindAll

構建一個字符串類型的數組進行演示測試
第一種方式
string[] arrayString = new string[] { "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten" }; string[] arrayResult = Array.FindAll(arrayString, (c) => c.Length > 3);
如上圖所示FindAll兩個參數第一個就是數組(字符串數組,int數組等等),第二個就是委托Predicate有一個參數。
上面的演示測試功能就是 測試字符串數組中的項的長度大於3的就返回,可以看出應該是有6個
下面來看一下測試結果

(c) => c.Length > 3 此處這就是一個lambda表達式
第二種方式
public void PredicateArrayTest() { string[] arrayString = new string[] { "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten" }; string[] arrayResult = Array.FindAll(arrayString, (c) => c.Length > 3); string[] arrayResultMethod = Array.FindAll(arrayString, GetString); } private bool GetString(string item) { if (item.Length > 3) { return true; } return false; }
通過一個GetString方法,也就是通過委托進行傳遞方法的方式
查看效果,結果是一樣的

第三種方式
string[] arrayResultDelegate = Array.FindAll(arrayString, delegate(string c) { return c.Length > 3; });
直接通過匿名代理可以達到同樣的效果。
查看源代碼可以發現,Array數組的其他很多方法同樣都使用了Predicate委托

再寫一個簡單的小例子進行鞏固一下對Precidate委托的使用
public string PredicateNewTest(Predicate<string> item ) { string[] arrayString = new string[] { "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten" }; foreach (string str in arrayString) { if (item(str)) { return str; } } return null; //return arrayString.FirstOrDefault(str => item(str)); } [TestMethod] public void PredicateNewTest() { string str = PredicateNewTest((c) => { return c.Length > 3; }); }
通過下面的函數進行調用之后返回

Predicate List
對List的實現其實和Array的實現原理幾乎完全一樣,暫時就不實現了,可以自己想想吧,之后看情況,自己再補上。
Func

可以很清楚的看出,封裝一個帶有返回 TResult 參數指定的類型值的方法,它有多個重載。下面我們通過委托來處理一下3*5=15的過程。
public delegate string MultiTest(int a, int b); [TestMethod] public void ActionTest() { MultiTest muliti = new MultiTest(MultiMethod); string result=muliti(3, 5); } public string MultiMethod(int a,int b) { return (a*b).ToString(); }
其中:定義一個有兩個int類型參數的,返回值為字符串的委托。聲明一個乘法的方法,並且返回字符串,然后調用。

那么現在我們來使用Func來優化的代碼是什么樣呢
public string MultiMethod(int a,int b) { return (a*b).ToString(); } [TestMethod] public void FuncTest() { Func<int,int,string> func=new Func<int, int, string>(MultiMethod); string result = func(3, 5); }
結果為

是不是很簡單呢,那么你自己也試一下吧。
Action

Action與Func極為類似,只不過Action執行沒有返回值而已,那么應該就更簡單一些了,在此就不進行示例講解了。
