1. 程式人生 > >C#中Predicate與Func泛型委托的用法實例

C#中Predicate與Func泛型委托的用法實例

public pan html 加水印 pre wid bcf 委托 ora

本文以實例形式分析了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方法所使用的參數是相同的,但事實是否真是如此?

事實上,List<T>.Exists和List<T>.First的參數分別使用了不同的委托:

Predicate<T>和Func<T, bool>。從函數的簽名上看,兩者沒有區別,都是指代的參數類型為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");
  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>的確指代的是同一類具有相同簽名的函數,而我們往往又不希望將匿名方法的方法體重復地寫兩次以分別賦予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要用這樣兩種完全不同的泛型委托來實現Exists和First方法,這使得某些情況下代碼變得相對復雜,甚至容易出錯。我想大概是為了語義清晰的緣故,Exists不過是做判斷,因此需要用斷言表達式,而在做First操作的時候,則更多的意義上是在叠代地調用指定的方法。學無止境,有待繼續探索。

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

除聲明外,跑步客文章均為原創,轉載請以鏈接形式標明本文地址
C#中Predicate與Func泛型委托的用法實例

本文地址: http://www.paobuke.com/develop/c-develop/pbk23540.html






相關內容

技術分享C# 中實現ftp 圖片上傳功能(多快好省)技術分享C#給PDF文件添加水印技術分享C#多線程編程詳解技術分享C#實現單鏈表(線性表)完整實例
技術分享C#中圖片旋轉和翻轉(RotateFlipType)用法分析技術分享C#語法相比其它語言比較獨特的地方(三)技術分享C#針對xml文件轉化Dictionary的方法技術分享C#判斷日期是否到期的方法

C#中Predicate與Func泛型委托的用法實例