Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反转系统。谓词<;T>;_C#_.net - Fatal编程技术网

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));