如何反转System.Predicate <T>

Lui*_*rao 3 .net c#

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

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

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

Jon*_*eet 7

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

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

然后:

bar(p.Invert());
Run Code Online (Sandbox Code Playgroud)

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