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