什么是委托
Predicate<T>
的用途,我应该将其处理为嵌套样式吗,例如Func<Predicate<T>>
?请给出一个简单的例子。Predicate<T>
的用途,我应该将其处理为嵌套样式吗,例如Func<Predicate<T>>
?请给出一个简单的例子。有一些情况下,允许调用方提供一个返回true
或false
的函数是很有用的。而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");
});
Array.FindAll(strings, s => s.StartsWith("h"));
FindAll
方法返回一个数组,其中包含所有满足条件的项。在这种情况下,所有以“h”开头的字符串。 Predicate
是 s.StartsWith("h")
。Array
类知道如何搜索其所有元素,并创建一个仅包含匹配元素的新数组。该算法的这一部分对许多代码片段都是共通的。不共通的部分是匹配条件,这将根据特定代码片段的要求而变化。因此,调用者指定了逻辑的那部分,并将其作为 Predicate
传递。Func<Predicate<T>>
表示您声明了一个返回 Predicate<T>
的函数。您确定这是您想要的吗?您想要实现什么?// 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;
}
这定义了一个返回谓词(返回 true 或 false 的函数)的函数。你如何使用它?你可以通过将其委托给另一个函数来移除返回哪个谓词的责任,该函数的工作不是返回 True 或 False,而是允许你在需要时延迟执行谓词。