C#泛型委托Predicate、Action、Func


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執行沒有返回值而已,那么應該就更簡單一些了,在此就不進行示例講解了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM