C#中的謂詞代表
回答
謂詞是返回true
或false
的功能。謂詞委託是對謂詞的引用。
因此,基本上謂詞代表是對返回true
或false
的函數的引用。謂詞對於過濾值列表非常有用 - 以下是一個示例。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
Predicate<int> predicate = new Predicate<int>(greaterThanTwo);
List<int> newList = list.FindAll(predicate);
}
static bool greaterThanTwo(int arg)
{
return arg > 2;
}
}
現在,如果你使用的是C#3你可以使用lambda來代表一個更清潔的方式斷言:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
List<int> newList = list.FindAll(i => i > 2);
}
}
只是一個返回布爾值的委託。它在過濾列表中使用很多,但可以在任何地方使用。
List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
有上謂詞here的好文章,雖然它從.NET2時代的,所以在那裏沒有提及lambda表達式。
從Andrew關於c#2和c#3的回答開始,你也可以爲它們內聯一個搜索函數(見下面)。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int> { 1, 2, 3 };
List<int> newList = list.FindAll(delegate(int arg)
{
return arg> 2;
});
}
}
希望這會有所幫助。
如果在VB 9(VS2008)是,謂詞是一個複雜的功能:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(AddressOf GreaterThanTwo)
...
Function GreaterThanTwo(ByVal item As Integer) As Boolean
'do some work'
Return item > 2
End Function
或者你也可以寫你的謂詞作爲一個lambda,只要它是唯一一個表達:
Dim list As New List(Of Integer)(New Integer() {1, 2, 3})
Dim newList = list.FindAll(Function(item) item > 2)
基於謂詞的搜索方法允許一個方法委託或lambda表達式來決定給定的元素是否爲 謂詞是一個簡單的委託接受一個對象,並返回真或假「匹配」。: 公共委託布爾謂詞(T對象);
static void Main()
{
string[] names = { "Lukasz", "Darek", "Milosz" };
string match1 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
//or
string match2 = Array.Find(names, delegate(string name) { return name.Contains("L"); });
//or
string match3 = Array.Find(names, x => x.Contains("L"));
Console.WriteLine(match1 + " " + match2 + " " + match3); // Lukasz Lukasz Lukasz
}
static bool ContainsL(string name) { return name.Contains("L"); }
什麼是謂詞委託?
1)謂詞是一個返回true或false的特性。這個概念已經出現在.net 2.0框架中。 2)它與lambda表達式(=>)一起使用。它將泛型作爲參數。 3)它允許定義謂詞函數並將其作爲參數傳遞給另一個函數。 4)這是一個Func
的特殊情況,因爲它只需要一個參數並且總是返回一個布爾值。
在C#名稱空間:
namespace System
{
public delegate bool Predicate<in T>(T obj);
}
它是在系統命名空間中定義。
我們應該在哪裏使用Predicate Delegate?
我們應該在以下情況下使用謂詞代表:
1)對於泛型集合搜索項目。 例如
var employeeDetails = employees.Where(o=>o.employeeId == 1237).FirstOrDefault();
2)縮短代碼,並返回基本示例true或false:
Predicate<int> isValueOne = x => x == 1;
現在
,呼叫上述謂詞:
Console.WriteLine(isValueOne.Invoke(1)); // -- returns true.
3)匿名方法也可以被分配到Predicate代表類型如下:
Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());};
bool result = isUpper("Hello Chap!!");
有關謂詞的任何最佳實踐?
使用Func,Lambda表達式和委託代替謂詞。
委託定義了一個引用類型,可用於封裝具有特定簽名的方法。 C#委託生命週期: C#委託的生命週期是
- 宣言
- 實例化
- INVACATION
瞭解更多形式 http://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html
- 1. C++ is_str_empty謂詞
- 2. 謂詞不起作用的代表
- 3. 問題的謂詞在C#
- 4. 謂詞和列表
- 5. 謂詞查找表?
- 6. 查找匹配的謂詞。謂詞的謂詞?
- 7. LINQ中的謂詞
- 8. prolog中的謂詞
- 9. C++ std :: sort類中的謂詞函數
- 10. 什麼是C#中的謂詞?
- 11. c中的泛型和謂詞#
- 12. 什麼是C++中的謂詞?
- 13. C++中的謂詞是什麼?
- 14. Remove_if列表的謂詞
- 15. 如何結合c#謂詞
- 16. 從Prolog的謂詞中「返回」列表
- 17. 在Prolog的列表中應用謂詞
- 18. 使用基於另一個謂詞的謂詞的謂詞過濾數組,這是謂詞的關鍵
- 19. 的XPath謂詞
- 20. 謂詞的ArrayList
- 21. C++如何在謂詞中使用「NOT」(!)?
- 22. 序言元謂詞:應用謂詞列表,通過恆定
- 23. 序言列表謂詞
- 24. 謂詞和lambda表達式
- 25. RDF表達謂詞程度
- 26. QueryDslPredicateExecutor:謂詞從兩個表
- 27. 表格視圖和謂詞
- 28. Spring Data + QueryDSL空謂詞+謂詞鏈接
- 29. 在序言中定義謂詞內的謂詞
- 30. Java中的謂詞8
@Andrew野兔:在你的第一個代碼片段應該是`yeild return`而不是?或者它是如何工作的,它是如何遍歷整個列表的? – VoodooChild 2011-09-26 16:42:33
@VoodooChild:請記住,序列中的每個元素將依次調用謂詞*。所以`greaterThanTwo`具有`return`而不是`yield return`,因爲它是爲你處理序列的`FindAll`方法。 – 2011-09-26 21:36:20