C#中Predicate<T>與Func<T, bool>泛型委托的用法實例
本文以實例形式分析了C#中Predicate<T>與Func<T, bool>泛型委托的用法,分享給大家供大家參考之用。具體如下:
先來看看下面的例子:
static void Main(string[] args) { List<string> l = new List<string>(); l.Add("a"); l.Add("b"); l.Add("s"); l.Add("t"); if (l.Exists(s => s.Equals("s"))) { string str = l.First(s => s.Equals("s")); Console.WriteLine(str); } else Console.WriteLine("Not found"); }
非常簡單,就是先判斷字符串列表l中是否有s字符串,如果有,則取之并顯示出來。從代碼中可以看到,l.Exists方法和l.First方法所使用的參數(shù)是相同的,但事實是否真是如此?
事實上,List<T>.Exists和List<T>.First的參數(shù)分別使用了不同的委托:
Predicate<T>和Func<T, bool>。從函數(shù)的簽名上看,兩者沒有區(qū)別,都是指代的參數(shù)類型為T,返回值為bool的函數(shù),但畢竟兩者屬于不同的委托類型,因此,下面的代碼顯然是無法編譯通過的:
static void Main(string[] args) { List<string> l = new List<string>(); l.Add("a"); l.Add("b"); l.Add("s"); l.Add("t"); Func<string, bool> p = s => s.Equals("s"); if (l.Exists(p)) { string str = l.First(p); Console.WriteLine(str); } else Console.WriteLine("Not found"); }
然而,由于Predicate<T>和Func<T, bool>的確指代的是同一類具有相同簽名的函數(shù),而我們往往又不希望將匿名方法的方法體重復地寫兩次以分別賦予Predicate<T>和Func<T, bool>泛型委托,因此,我們可以自己寫一個擴展方法,擴展Func<T, bool>類型以使其能夠很方便的轉換成Predicate<T>類型:
public static class Extensions { public static Predicate<T> ToPredicate<T> (this Func<T, bool> source) { Predicate<T> result = new Predicate<T>(source); return result; } }
在引入了這個擴展方法之后,我們的代碼就可以寫成下面的形式:
static void Main(string[] args) { List<string> l = new List<string>(); l.Add("a"); l.Add("b"); l.Add("s"); l.Add("t"); Func<string, bool> p = s => s.Equals("s"); if (l.Exists(p.ToPredicate())) { string str = l.First(p); Console.WriteLine(str); } else Console.WriteLine("Not found"); }
說實話不知為何MS要用這樣兩種完全不同的泛型委托來實現(xiàn)Exists和First方法,這使得某些情況下代碼變得相對復雜,甚至容易出錯。我想大概是為了語義清晰的緣故,Exists不過是做判斷,因此需要用斷言表達式,而在做First操作的時候,則更多的意義上是在迭代地調用指定的方法。學無止境,有待繼續(xù)探索。
希望本文所述對大家的C#程序設計有所幫助
相關文章
C#中哈希表(HashTable)用法實例詳解(添加/移除/判斷/遍歷/排序等)
這篇文章主要介紹了C#中哈希表(HashTable)用法,簡單講述了哈希表的原理并結合實例形式詳細分析了C#針對哈希表進行添加、移除、判斷、遍歷、排序等操作的實現(xiàn)技巧,需要的朋友可以參考下2016-06-06C#中多維數(shù)組[,]和交錯數(shù)組[][]的區(qū)別
這篇文章介紹了C#中多維數(shù)組[,]和交錯數(shù)組[][]的區(qū)別,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01漢字轉拼音縮寫示例代碼(Silverlight和.NET 將漢字轉換成為拼音)
本篇文章主要介紹了漢字轉拼音縮寫示例代碼(Silverlight和.NET 將漢字轉換成為拼音) 需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01C#實現(xiàn)xml文件反序列化讀入數(shù)據(jù)到object的方法
這篇文章主要介紹了C#實現(xiàn)xml文件反序列化讀入數(shù)據(jù)到object的方法,涉及C#操作XML文件類型轉換的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07C#中const,readonly和static關鍵字的用法介紹
這篇文章介紹了C#中const,readonly和static關鍵字的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08