C# 如何反转系统。谓词<;T>;
假设我有一个C# 如何反转系统。谓词<;T>;,c#,.net,C#,.net,假设我有一个谓词,我想用返回true的谓词调用方法foo,用返回false的谓词调用方法bar,我该怎么做: Predicate<int> p = i => i > 0 foo(p); bar(!p); // obviously this doesn't work 谓词p=i=>i>0 富(p),; 巴(!p);//显然这不起作用 如果谓词是Func f,我就可以!f(i)您可以轻松创建一个方法来返回“反向”谓词-您甚至可以将其作为扩展方法: public stati
谓词
,我想用返回true的谓词调用方法foo,用返回false的谓词调用方法bar,我该怎么做:
Predicate<int> p = i => i > 0
foo(p);
bar(!p); // obviously this doesn't work
谓词p=i=>i>0
富(p),;
巴(!p);//显然这不起作用
如果谓词是
Func f
,我就可以!f(i)
您可以轻松创建一个方法来返回“反向”谓词-您甚至可以将其作为扩展方法:
public static Predicate<T> Invert<T>(this Predicate<T> predicate)
{
// TODO: Nullity checking
return x => !predicate(x);
}
基本上,如果你有一个
Func
,你就会这么做——这两种委托类型都没有什么“魔力”。你可以用lambda来包装谓词
bar(x => !p(x));
一个
谓词
就像一个函数
,所以我看不出有什么问题<代码>!f(i)是正确的答案。这不是链接的问题的重复-这是关于创建反向表达式树的问题。这只是代表。@JonSkeet:对不起,这件怎么样@帕特里克·霍夫曼:是的,这看起来是个更好的骗局。尽管我更喜欢用扩展方法来回答:)@xanatos:OP的foo
和bar
方法有一个谓词类型的参数,而不是int
<代码>!p(i)
是对p(i)
的否定,并产生int
,而不是谓词,因此您的建议不适用于本例。这很完美,我将在9分钟后标记为答案:)对不起,我的意思是除了已接受的答案之外。我也从我的帖子中删除了这个词。
bar(x => !p(x));