Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# 4.0 有人能进一步解释一下这个C代码吗_C# 4.0_Lambda_Predicatebuilder - Fatal编程技术网

C# 4.0 有人能进一步解释一下这个C代码吗

C# 4.0 有人能进一步解释一下这个C代码吗,c#-4.0,lambda,predicatebuilder,C# 4.0,Lambda,Predicatebuilder,我使用的是来自的PredicateBuilder类 公共静态表达式或(此表达式expr1, 表达式expr2) { var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast()); 返回表达式.Lambda (Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters); } 此扩展方法使用OR运算符链接谓词。在页面上,解释说 我们首先用第一个表达式的参数调用第二个表达式

我使用的是来自的PredicateBuilder类

公共静态表达式或(此表达式expr1,
表达式expr2)
{
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters.Cast());
返回表达式.Lambda
(Expression.OrElse(expr1.Body,invokedExpr),expr1.Parameters);
}
此扩展方法使用OR运算符链接谓词。在页面上,解释说

我们首先用第一个表达式的参数调用第二个表达式。调用表达式使用给定表达式作为参数调用另一个lambda表达式。我们可以从第一个表达式的主体和第二个表达式的调用版本创建条件表达式。最后一步是将其包装到新的lambda表达式中


比如说,如果我有

Predicate<Book> p1 = b => b.Title.Contains("economy");
Predicate<Book> p2 = b=>b.PublicationYear>2001;
Predicate chain = p1.And(p2);
谓词p1=b=>b.Title.Contains(“经济”);
谓词p2=b=>b.PublicationYear>2001;
谓词链=p1和(p2);
我还没完全弄明白。有人能解释一下上面扩展方法的代码是如何工作的吗?
谢谢

让我们像这样重写方法体:

return Expression.Lambda<Func<T, bool>>(
    Expression.OrElse(
        expr1.Body,
        Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>())
    ),
    expr1.Parameters);
返回表达式.Lambda(
奥莱尔斯酒店(
expr1.主体,
Expression.Invoke(expr2、expr1.Parameters.Cast())
),
expr1.参数);
我们还应该记住,
expr1
是您现有的表达式,它接受
T
并返回
bool
。此外,虽然我们正在使用的表达式树实际上没有做任何事情(它们代表一些东西),但我将使用“do”,因为它使阅读更容易。从技术上讲,要使表达式树实际执行某些操作,必须先对其执行操作,然后调用生成的委托

好的,我们这里有什么?这是一个lambda表达式,它接受
expr1
所接受的任何参数(参见最后一行),其主体根据

表示条件或操作的
二进制表达式
仅当第一个操作数的计算结果为时,才计算第二个操作数 错


第一个操作数是
expr1.Body
,这意味着结果函数(实际上不是函数,请参见上文注释)的计算结果是
expr1
。如果结果为
true
,则会立即返回
true
。否则,它将使用与传递给
expr1
的参数相同的参数调用
expr2
(这意味着单个
T
参数),并返回结果。

您不清楚哪一部分?您能详细说明一下吗?第二个表达式如何使用第一行上的第一个参数调用,以及lambda表达式如何构造和返回。好的,如果expre1返回false,那么expr2将使用相同的参数调用。这就是我错过的。
return Expression.Lambda<Func<T, bool>>(
    Expression.OrElse(
        expr1.Body,
        Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>())
    ),
    expr1.Parameters);