Predicate<T>委托在.NET類類別庫中經常出現,此委托的定義如下:
public delegatebool Predicate<T>(T obj);
從其定義可以看到,此委托參考一個回傳bool 值的方法,在實際開發中,通常使用Predicate<T>委托變數參考一個“判斷條件函式”,在判斷條件函式內部書寫代碼表明
函式引數所參考的物件應滿足的條件,條件滿足時,函式回傳true.
我沒有搞明白:Predicate<T>委托變數參考一個的是什么樣的“判斷條件函式”?這個“判斷條件函式”能否有引數?如果可以有,能有幾個引數?
uj5u.com熱心網友回復:
最典型的用法是 List<T> 的 Find(Predicate<T> match)方法,相信你一定會的
uj5u.com熱心網友回復:
Predicate 其實是很早期的東西,后來到了 Linq 時代,實際上使用通用的 Func<T,bool> 自然是取代了它。“宣告”就是一種輸入輸出的宣告,如果你要糾結“它的實作代碼是什么樣兒的?”這就是本末倒置了。你只有照著教科書實際去敲一個函式代碼,并且“將這個函式作為引數傳給委托變數”,你才明白代碼是什么樣兒的。
代碼是什么樣兒的?你絕對實作不出任何超過自己認知的函式。
uj5u.com熱心網友回復:
說起來比較繞 但是對于你的為題很簡單 對于委托來說 形參一定形如委托 也就說只能有一個引數 并且回傳bool判斷函式做的事情也很簡單 只是決定什么樣的T滿足條件
uj5u.com熱心網友回復:
泛型委托,Predicate<T>與Func<T, bool>。事實上,List<T>.Exists和List<T>.First的引數分別使用的就是這兩個:Predicate<T>和Func<T, bool>。
從函式的簽名上看,兩者沒有區別,都是指代的引數型別為T,回傳值為bool的函式,但畢竟兩者屬于不同的委托型別。
List<T> Entity.First與Entity.Exists就是用來做條件判斷的方法。
uj5u.com熱心網友回復:
如果先有了 Linq 那么大概率就不會再有 Predicate 了。實際上是比 Linq 早至少10年(從90年代的VB開始)就出現了Predicate委托,并且List<>早在IEnumerable<>等等出現之前就廣泛地用了什么 ForEach、All、Any 等等函式封裝,先有了蛋后有了雞,所以才以為所有的雞都是雞蛋生下來的。uj5u.com熱心網友回復:
“型別宣告”其實是一種很重要的概念,編譯器通過它來檢查程式有沒有什么設計 bug。學過一點編譯系統原理的人會比較清晰地了解編譯的概念。如果對編譯系統的重要性比較含糊,如果甚至以為最好是“酥心所欲地解釋、混沌、萬能、元”才是方便的編程語言,那么自然就不能理解為什么真正的高級編程語言都要首先建立一套 Type 規范。
宣告就像是合同,說明了行為的框架,說明按照規范應該“如何做”,而不是糾結“里邊是什么”。
uj5u.com熱心網友回復:
我想說的是:在表單應用程式中,這個“判斷條件函式”是不是可以從表單的控制元件中接受引數?uj5u.com熱心網友回復:
Predicate<T>委托變數參考的是一個什么樣的“判斷條件函式”?知道“判斷條件函式”可以回傳一個布爾型別的值,不知道能接受什么樣的引數(int、float或string)?uj5u.com熱心網友回復:
說了半天 你不知道什么是泛型???????uj5u.com熱心網友回復:
所以啊,我們有時候反對不說自己到底想干啥,就不知道從那篇博文里找個名詞的問題
你早這么說,早有人回復你 ,請參見dynamiclinq
因為你從表單過來的含義,我可以理解成一個字串 a.xx>15 他不是代碼,他只是一個字串。而C#本身是靜態編譯型,他不支持直接執行字串
想變成代碼,你需要會很多玩意,具體我也不多說了,免得又有一堆玻璃心的說俺們欺負新人
所以干脆直接給一個不需要那些具體原理,大概可以實作你要求的dynamiclinq給你
uj5u.com熱心網友回復:
你這個基礎很凌亂。先把泛型物體搞清楚,再去理解這個泛型委托方法,和看一些實體demo,就好理解了。
為什么要這么學?因為在學習List<T>,還是List<Entity>等泛型物體的同時,必須要了解掌握LINQ、Lambda運算式之用法。
在學習運算式的時候,就會去深入了解.Any()、.FIrst()以及.Exists()的方法的應用。
此時,再單獨研究一下泛型委托的原理,就通俗易懂了。不要把問題先抽象化,這很不利于學習。
uj5u.com熱心網友回復:
手機回復,我懶得到官方給你找資料隨便百度一個某園子的用這個寫的玩意
var query = db.Customers
.Where("City == @0 and Orders.Count >= @1", "London", 10)
.OrderBy("CompanyName")
.Select("new(CompanyName as Name, Phone)");
你看到了,where里他寫的是字串。
所以你說的需求,我來猜也就是你有個textbox讓人輸入過濾條件字串,然后他就可以過濾了。
對,這玩意可以有限度的支持這種要求(注意是有限度支持,太過復雜的玩意支持他其實很費勁的,都不如直接上antlr4去做sql規則引擎了)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/283621.html
標籤:C#
