C#中Predicate<T>與Func<T, bool>泛型委派的用法執行個體

來源:互聯網
上載者:User

標籤:

本文以執行個體形式分析了C#中Predicate<T>與Func<T, bool>泛型委派的用法,分享給大家供大家參考之用。具體如下:

先來看看下面的例子:

12345678910111213141516 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的函數,但畢竟兩者屬於不同的委託類型,因此,下面的代碼顯然是無法編譯通過的:

12345678910111213141516 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>類型:

12345678 public static class Extensions { public static Predicate<T> ToPredicate<T> (this Func<T, bool> source) { Predicate<T> result = new Predicate<T>(source); return result; } }

在引入了這個擴充方法之後,我們的代碼就可以寫成下面的形式:

12345678910111213141516 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<T>與Func<T, bool>泛型委派的用法執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.