首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -委派Predicate<T>

C# -委派Predicate<T>
EN

Stack Overflow用户
提问于 2009-08-22 06:10:19
回答 3查看 3.6K关注 0票数 3

委托Predicate<T>的用处是什么?我应该像这样处理它吗?

Func<Predicate<T>>?请给我一个简单的例子。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-22 06:13:07

在一些用例中,允许调用者提供返回truefalse的函数是很有用的。Predicate<T>类型就是这样做的一种方式。这与Func<T, bool>没有什么不同(除了早期版本的C#中提供了Predicate<T> )。

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

代码语言:javascript
复制
string[] strings = new string[] { "hello", "goodbye", "how are you" };

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

或者,lambda风格:

代码语言:javascript
复制
Array.FindAll(strings, s => s.StartsWith("h"));

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

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

你可以用一个“嵌套”的风格来处理它。Func<Predicate<T>>表示声明了一个返回Predicate<T>的函数。你确定这是你想要的吗?你想要达到什么目的?

票数 11
EN

Stack Overflow用户

发布于 2009-08-22 06:26:01

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2009-08-22 06:25:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1315282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档