国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中Predicate<T>與Func<T, bool>泛型委托的用法實例

2020-01-24 02:26:23
字體:
供稿:網(wǎng)友

本文以實例形式分析了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ù),而我們往往又不希望將匿名方法的方法體重復(fù)地寫兩次以分別賦予Predicate<T>和Func<T, bool>泛型委托,因此,我們可以自己寫一個擴展方法,擴展Func<T, bool>類型以使其能夠很方便的轉(zhuǎn)換成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方法,這使得某些情況下代碼變得相對復(fù)雜,甚至容易出錯。我想大概是為了語義清晰的緣故,Exists不過是做判斷,因此需要用斷言表達式,而在做First操作的時候,則更多的意義上是在迭代地調(diào)用指定的方法。學(xué)無止境,有待繼續(xù)探索。

希望本文所述對大家的C#程序設(shè)計有所幫助

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巨野县| 金堂县| 广丰县| 英德市| 信丰县| 台南市| 大连市| 静安区| 绥宁县| 辽阳县| 大洼县| 齐齐哈尔市| 皮山县| 南投市| 清水县| 汪清县| 义马市| 泰宁县| 灵石县| 瓦房店市| 唐河县| 汉阴县| 安仁县| 五台县| 太白县| 万荣县| 集安市| 正蓝旗| 鹿邑县| 腾冲县| 清水河县| 沙田区| 永年县| 霍邱县| 个旧市| 黄陵县| 洛南县| 墨竹工卡县| 民丰县| 吉隆县| 塔河县|