最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年09月06日 11:22:10   投稿:shichen2014  
這篇文章主要介紹了C#中Predicate<T>與Func<T, bool>泛型委托的用法,指出了其用法中的誤區(qū)及易錯(cuò)點(diǎn),有助于更好的理解泛型委托的用法,需要的朋友可以參考下

本文以實(shí)例形式分析了C#中Predicate<T>與Func<T, bool>泛型委托的用法,分享給大家供大家參考之用。具體如下:

先來(lái)看看下面的例子:

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");  
}  

非常簡(jiǎn)單,就是先判斷字符串列表l中是否有s字符串,如果有,則取之并顯示出來(lái)。從代碼中可以看到,l.Exists方法和l.First方法所使用的參數(shù)是相同的,但事實(shí)是否真是如此?

事實(shí)上,List<T>.Exists和List<T>.First的參數(shù)分別使用了不同的委托:
Predicate<T>和Func<T, bool>。從函數(shù)的簽名上看,兩者沒(méi)有區(qū)別,都是指代的參數(shù)類型為T,返回值為bool的函數(shù),但畢竟兩者屬于不同的委托類型,因此,下面的代碼顯然是無(wú)法編譯通過(guò)的:

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>泛型委托,因此,我們可以自己寫一個(gè)擴(kuò)展方法,擴(kuò)展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;  
  }  
}  

在引入了這個(gè)擴(kuò)展方法之后,我們的代碼就可以寫成下面的形式:

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");  
}  

說(shuō)實(shí)話不知為何MS要用這樣兩種完全不同的泛型委托來(lái)實(shí)現(xiàn)Exists和First方法,這使得某些情況下代碼變得相對(duì)復(fù)雜,甚至容易出錯(cuò)。我想大概是為了語(yǔ)義清晰的緣故,Exists不過(guò)是做判斷,因此需要用斷言表達(dá)式,而在做First操作的時(shí)候,則更多的意義上是在迭代地調(diào)用指定的方法。學(xué)無(wú)止境,有待繼續(xù)探索。

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

相關(guān)文章

  • unity實(shí)現(xiàn)UI元素跟隨3D物體

    unity實(shí)現(xiàn)UI元素跟隨3D物體

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)UI元素跟隨3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 基于C#編寫一個(gè)遠(yuǎn)程桌面應(yīng)用

    基于C#編寫一個(gè)遠(yuǎn)程桌面應(yīng)用

    封閉環(huán)境無(wú)法拷貝外來(lái)的遠(yuǎn)程桌面軟件,所以這篇文章小編就來(lái)帶大家用C#編寫一個(gè)簡(jiǎn)單的遠(yuǎn)程桌面應(yīng)用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • c#判斷操作系統(tǒng)位數(shù)的示例分享

    c#判斷操作系統(tǒng)位數(shù)的示例分享

    這篇文章主要介紹了c#判斷操作系統(tǒng)位數(shù)的示例,在.net 4.5中,判斷操作系統(tǒng)不用再寫方法去判斷了,有直接可以利用的屬性了哦
    2014-01-01
  • ASP.NET總結(jié)C#中7種獲取當(dāng)前路徑的方法

    ASP.NET總結(jié)C#中7種獲取當(dāng)前路徑的方法

    本文主要介紹了7種獲取當(dāng)前路徑的方法,并做了代碼演示,分享給大家,感興趣的朋友可以參考一下。
    2016-03-03
  • 快速了解如何在.NETCORE中使用Generic-Host建立主機(jī)

    快速了解如何在.NETCORE中使用Generic-Host建立主機(jī)

    這篇文章主要介紹了如何在.NETCORE中使用Generic-Host建立主機(jī),文中代碼非常詳細(xì),可供大家參考,感興趣的朋友不妨閱讀完
    2020-05-05
  • C#生成設(shè)置范圍內(nèi)的Double類型隨機(jī)數(shù)的方法

    C#生成設(shè)置范圍內(nèi)的Double類型隨機(jī)數(shù)的方法

    這篇文章主要介紹了C#生成設(shè)置范圍內(nèi)的Double類型隨機(jī)數(shù)的方法,對(duì)于C#的初學(xué)者有很好的借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • 基于C#制作一個(gè)休息提醒鬧鐘的詳細(xì)步驟

    基于C#制作一個(gè)休息提醒鬧鐘的詳細(xì)步驟

    小鬧鐘大家都應(yīng)該很熟悉,它包括時(shí)間、事件,當(dāng)達(dá)到某某時(shí)間時(shí),事件發(fā)生了,并且還有一個(gè)提示信息,下面這篇文章主要給大家介紹了關(guān)于如何基于C#制作一個(gè)休息提醒鬧鐘的詳細(xì)步驟,需要的朋友可以參考下
    2023-02-02
  • c# ArrayList的使用方法小總結(jié)

    c# ArrayList的使用方法小總結(jié)

    arraylist是接口list的實(shí)現(xiàn)類,所以在使用過(guò)程中比較推薦使用list接口來(lái)實(shí)現(xiàn),arraylist在程序開(kāi)發(fā)過(guò)程中應(yīng)用非常廣泛,接下來(lái),腳本之家的小編給大家總結(jié)了arraylist的使用,有需要的朋友可以參考下
    2015-09-09
  • C#實(shí)現(xiàn)電子郵件發(fā)送功能(支持普通文本,HTML和附件)

    C#實(shí)現(xiàn)電子郵件發(fā)送功能(支持普通文本,HTML和附件)

    在日常開(kāi)發(fā)或自動(dòng)化任務(wù)中,發(fā)送電子郵件仍然是最常用的數(shù)據(jù)傳遞方式之一,本文我們就來(lái)講講如何使用?C#?發(fā)送包含普通文本,HTML?正文以及附件的電子郵件吧
    2025-07-07
  • C#使用Npoi實(shí)現(xiàn)生成Word文檔

    C#使用Npoi實(shí)現(xiàn)生成Word文檔

    這篇文章主要為大家詳細(xì)介紹了C#如何使用Npoi實(shí)現(xiàn)生成Word文檔,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-03-03

最新評(píng)論

龙胜| 玛多县| 田林县| 正安县| 阳信县| 泗洪县| 疏勒县| 淮滨县| 汉寿县| 共和县| 大田县| 抚顺县| 孟津县| 石泉县| 汉中市| 兰溪市| 建德市| 阿城市| 卢湾区| 达日县| 扶沟县| 唐海县| 金堂县| 东宁县| 武邑县| 广东省| 上虞市| 青海省| 高雄县| 方正县| 丰城市| 清远市| 宝应县| 同心县| 日照市| 秦皇岛市| 辰溪县| 长顺县| 临夏市| 南召县| 汽车|