C#中Predicate<T>與Func<T, bool>泛型拜托的用法實例。本站提示廣大學習愛好者:(C#中Predicate<T>與Func<T, bool>泛型拜托的用法實例)文章只能為提供參考,不一定能成為您想要的結果。以下是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辦法所應用的參數是雷同的,但現實能否真是如斯?
現實上,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#法式設計有所贊助