如何反转System.Predicate <t>

时间:2015-06-25 13:27:10

标签: c# .net

假设我有Predicate<T>,我想调用方法foo,谓词返回true,我想调用方法栏,谓词返回false,我该怎么做:

Predicate<int> p = i => i > 0
foo(p);
bar(!p); // obviously this doesn't work

如果谓词是Func<int, bool> f,我可以!f(i)

2 个答案:

答案 0 :(得分:7)

您可以轻松创建一个返回“反向”谓词的方法 - 您甚至可以将其作为扩展方法:

public static Predicate<T> Invert<T>(this Predicate<T> predicate)
{
    // TODO: Nullity checking
    return x => !predicate(x);
}

然后:

bar(p.Invert());

基本上,如果你有一个Func<int, bool>,那就是你要做的事情 - 对于这些代表类型中没有任何“魔力”。

答案 1 :(得分:1)

您可以将谓词包装在lambda中。

bar(x => !p(x));