当前位置: 首页 > 编程语言 > C#

LINQlambda表达式参数应该在第二个lambda中重用吗?分享

时间:2023-04-10 17:58:50 C#

LINQlambda表达式参数应该在第二个lambda中重用?在这个问题之后,我想知道重用lambda参数表达式的实例是好是坏?我有时会得到一个完整的LINQ表达式树,其中在第二个非生成的lambda中正确使用了相同的lambda参数实例://classPerson{publicintAProp{get;放;}publicboolBProp{得到;放;}}varlparam=Expression.Parameter(typeof(Person),"x");varlambda1=(Expression)Expression.Lambda(Expression.Property(lparam,"AProp"),lparam);varlambda2=(Expression)Expression.Lambda(Expression.Property(lparam,"BProp"),lparam);varsource=(newPerson[0]).AsQueryable();varquery=source.Where(lambda2).顺序(lambda1);因此,同一个lambda参数实例lparam的声明对于lambda1和lambda2都是正确的。只是这个共享的lambda参数实例强制IQueryProvider实现不关联基于纯lambda参数引用的其他全局含义,因为在处理不同的lambda时可能需要对相同的参数进行不同的解释。此外,您不会通过使用Expressionlambda3=x=>x.AProp;从LINQ获得这种表达式树(或者我应该说图形?)表达式lambda4=x=>x.BProp;因为两个lambda表达式都有不同的(Personx)参数实例。以同样的方式varquery=source.Where(x=>x.BProp).OrderBy(x=>x.AProp);或varquery=fromxinsourcewherex.BProporderbyx.APropselectx;它还使表达式树成为图形。这种参数实例复用是好是坏?到目前为止,我还没有从官方那里得到明确的答复。我不会在两个不相交的lambda之间共享参数对象。首先,我们不要在这里制造虚假经济。物美价廉,十万都造不出来。(如果是,您可能有更大的问题需要解决。)其次,正如您所注意到的,在不相关的lambda中共享对相同参数对象的引用意味着解析这些lambda表达式树的代码需要了解参数对象在不同的??上下文中具有不同的含义.这似乎是一个等待发生的错误。第三,假设有一天您可能需要两个表达式树:x=>Foo(x);y=>酒吧(y);并从中构建第三个,比如:(x,y)=>Foo(x)&&Bar(y);如果x和y实际上是同一个参数对象,那么你就有问题了:(x,x)=>Foo(x)&&Bar(x);//嗯?另一方面,StriplingWarrior的回答指出,如果您有x=>Foo(x);x=>酒吧(x);那么将它们组合起来就更容易了x=>Foo(x)&&Bar(x);因为那时您不需要重写任何东西。基本上,这似乎是一个冒险的举动,没有真正令人信服的好处,为什么?您需要考虑您的用例。以后这些lambdas会如何组合呢?例如,您想使用OR运算组合两个lambda表达式吗?表达式lambda1=p=>!p.IsDeleted;表达式lambda2=p=>p.DomainId==1;//我如何获得(p=>!p.IsDeleted||p.DomainId==1)?如果是这样,像这样加入它们会更容易:Expression.Lambda(Expression.OrElse(lambda1.Body,lambda2.Body),lambda1.Parameters[0]);如果它们都有相同的参数表达式对象,上面的代码就可以正常工作。如果他们不这样做,突然间你必须遍历整个lambda2树,创建一个新的表达式树来替换第一个表达式中的参数。这是可以做到的,而且我已经编写了一些实用方法,以便在我必须做这样的事情时变得容易,但是如果你能够弄清楚这是用例的类型,你可能会遇到问题自己首先使用相同的参数,生活变得更简单。另一方面,如果您要以参数需要在更大的lambda表达式中扮演不同角色的方式组合lambda,正如Eric指出的那样,那么您将需要这些参数不同。以上是C#学习教程:LINQlambda表达式参数是否应该在第二个lambda中复用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: