在C#中使用谓词代表

你能向我解释一下吗?

  • 什么是谓语代表?
  • 我们应该在哪里使用谓词?
  • 任何使用谓词的最佳实践?

描述性的源代码将不胜感激,

感谢所有答复!

谓词是一个返回truefalse的函数。 谓词委托是对谓词的引用。

所以基本上谓词委托是一个函数的引用,返回truefalse 。 谓词对于过滤值列表非常有用 – 这里是一个例子。

 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); } } 

从Andrew关于c#2和c#3的回答开始,你也可以为它们内联一个search函数(见下面)。

 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; }); } } 

希望这可以帮助。

只是一个返回布尔值的委托。 它用于过滤列表很多,但可以在任何你想要的地方使用。

 List<DateRangeClass> myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate); myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn): 

这里有一个关于谓词的好文章,虽然它是从.NET2时代开始的,所以在那里没有提到lambdaexpression式。

基于谓词的search方法允许方法委托或lambdaexpression式决定给定元素是否为“匹配”。谓词仅仅是接受对象并返回true或false的委托:public delegate bool Predicate(T object);

  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"); } 

如果你在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 

或者你可以把你的谓词写成一个lambdaexpression式,只要它是一个expression式即可:

 Dim list As New List(Of Integer)(New Integer() {1, 2, 3}) Dim newList = list.FindAll(Function(item) item > 2) 

什么是谓词代表?

1)Predicate是一个返回true或false的特性。这个概念已经进入.net 2.0框架。 2)正在使用lambdaexpression式(=>)。 它将generics作为参数。 3)它允许一个谓词函数被定义并作为parameter passing给另一个函数。 4)这是一个Func的特殊情况,它只需要一个参数,总是返回一个布尔值。

在C#命名空间中:

 namespace System { public delegate bool Predicate<in T>(T obj); } 

它在System命名空间中定义。

我们应该在哪里使用Predicate Delegate?

在下列情况下,我们应该使用谓词代表:

1)用于search通用集合中的项目。 例如

 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委托types,如下所示:

 Predicate<string> isUpper = delegate(string s) { return s.Equals(s.ToUpper());}; bool result = isUpper("Hello Chap!!"); 

任何有关谓词的最佳实践?

使用Func,Lambdaexpression式和代表而不是Predicates。

一个委托定义了一个引用types,可以用来封装具有特定签名的方法。 C#委托生命周期:C#委托的生命周期

  • 宣言
  • 实例化
  • 度假中

了解更多formshttp://asp-net-by-parijat.blogspot.in/2015/08/what-is-delegates-in-c-how-to-declare.html