C# - 委托 Predicate<T>

3
什么是委托 Predicate<T> 的用途,我应该将其处理为嵌套样式吗,例如Func<Predicate<T>>?请给出一个简单的例子。
3个回答

11

有一些情况下,允许调用方提供一个返回truefalse的函数是很有用的。而Predicate<T>类型就是实现这一功能的方式。这与Func<T, bool>(除了Predicate<T>在早期版本的C#中可用)没有任何区别。

一个简单(并且人为制造的)例子:

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> 的函数。您确定这是您想要的吗?您想要实现什么?

谢谢!我已经知道了VS2008的语法: MyList list; list.RemoveAll(l => l.Name == "N/A"); 但是我需要VS2005的语法,你的答案起作用了: list.RemoveAll(delegate(MyList l) { return l.Name.StartsWith("N/A"); }); - JohnB

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接