C# - 委托谓词<t> </t>

时间:2009-08-22 06:10:19

标签: c#

委托Predicate<T>的用途是什么,我应该将其作为嵌套样式处理,如

Func<Predicate<T>>?简单的例子。

3 个答案:

答案 0 :(得分:10)

有几个用例允许调用者提供返回truefalse的函数。 Predicate<T>类型是一种执行此操作的方法。这与Func<T, bool>没有什么不同(早期版本的C#中除Predicate<T>之外)。

一个简单的(和人为的例子):

string[] strings = new string[] { "hello", "goodbye", "how are you" };

Array.FindAll(strings, delegate(string s)
                           {
                               return s.StartsWith("h");
                           });

或,lambda风格:

Array.FindAll(strings, s => s.StartsWith("h"));

FindAll方法返回与条件匹配的所有项的数组。在这种情况下,所有以“h”开头的字符串。 Predicates.StartsWith("h")

这里有用的是,Array类知道如何搜索其所有元素,并创建一个只包含匹配元素的新数组。算法的这一部分对于许多代码是通用的。不常见的部分是匹配标准,它将根据特定代码段的要求而变化。因此,调用者指定逻辑的一部分,并将其作为Predicate传递。

可以以“嵌套”方式处理它。 Func<Predicate<T>>表示您正在声明一个返回Predicate<T>的函数。你确定这是你想要的吗?你想要实现什么目标?

答案 1 :(得分:2)

// Make a list of integers.
List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
// Call FindAll() using traditional delegate syntax.
Predicate<int> callback = new Predicate<int>(IsEvenNumber);
List<int> evenNumbers = list.FindAll(callback);

// Target for the Predicate<> delegate.
static bool IsEvenNumber(int i)
{
    // Is it an even number?
    return (i % 2) == 0;
}

答案 2 :(得分:0)

这定义了一个返回谓词的函数(一个返回true或false的函数)。你怎么用这个?您可以通过将其委托给另一个函数来删除返回给您的谓词的责任,该函数的作业不是返回True或False而是允许您在需要时延迟执行谓词。