2009-02-17 56 views
240

您能向我解释;C#中的谓词代表

  • 什么是谓词委托?
  • 我们应该在哪里使用谓词?
  • 使用谓词时的最佳实践?

描述源代码可以理解的,

感谢所有答复!

回答

305

谓词是返回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); 
    } 
} 
+0

@Andrew野兔:在你的第一个代码片段应该是`yeild return`而不是?或者它是如何工作的,它是如何遍历整个列表的? – VoodooChild 2011-09-26 16:42:33

+4

@VoodooChild:请记住,序列中的每个元素将依次调用谓词*。所以`greaterThanTwo`具有`return`而不是`yield return`,因为它是为你处理序列的`FindAll`方法。 – 2011-09-26 21:36:20

9

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

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

有上谓词here的好文章,虽然它从.NET2时代的,所以在那里没有提及lambda表达式。

79

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

希望这会有所帮助。

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) 
4

基于谓词的搜索方法允许一个方法委托或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"); } 
3

什么是谓词委托?

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表达式和委托代替谓词。