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

LINQ表达式树适合做树吗?分享

时间:2023-04-11 00:57:34 C#

LINQ表达式树对树有好处吗?如图所示,LINQ表达式树是否是一棵没有循环的正确树(是否有针对性,维基百科似乎不太一致)?以下C#表达式中表达式树的根是什么?(strings)=>s.Length一个表达式树看起来像这样,“->”代表一个节点的属性名,可以通过其他节点访问。->Parameters[0]Lambda----------Parameter(strings)/->Body/->Expression/Member(Length)使用ExpressionVisitor访问LambdaExpression时,ParameterExpression会被访问两次。有没有一种方法可以使用ExpressionVisitor访问LambdaExpression,以便仅访问一次所有节点,并以特定的、众所周知的顺序(预排序、排序、后排序等)访问?是的是的。LambdaExpression的实际“骨干”(如果你愿意的话)是.Body;然而,参数是关于树结构(以及它需要什么)的必要元数据。顶部的参数(您的虚线)实际上并不是树的功能图的一部分-只有当稍后使用这些节点时,它们才会使用它们感兴趣的树的实际主体作为值。必须访问ParameterExpression两次,以便有人可以根据需要交换参数-例如,构造一个具有相同数量参数但不同参数实例(可能改变类型)的全新LambdaExpression。订单将相当稳定,但应被视为实施细节。例如,给定一个像Add(A,B)这样的节点,我先访问A还是先访问B并没有语义上的区别。只是为Marc的正确答案添加一点:AreLINQexpressiontreespoint-to-graphgraphswithoutcycles?首先,是的,表达式树是DAG——有向无环图。我们知道它们是非循环的,因为表达式树是不可变的,因此必须从叶子构造。在这种情况下,没有办法进行循环,因为循环中的所有节点都必须最后分配,而这显然不会发生。因为部分是不可变的,所以表达式“树”实际上不必是树本身。正如Marc指出的那样,需要重新使用对参数的引用;这就是我们如何确定何时使用声明的参数。重用其他部分虽然合法,但有些奇怪。例如,如果你想为(intx)=>(x+1)*(x+1)的主体表示一个表达式树,你可以为(x+1)创建一个表达式树,然后将两个孩子相乘of表达式树的一个节点。使用ExpressionVisitor访问LambdaExpression时,ParameterExpression会被访问两次。有没有一种方法可以使用ExpressionVisitor访问LambdaExpression,以便仅访问一次所有节点,并以特定的、众所周知的顺序(预排序、排序、后排序等)访问?ExpressionVisitor是一个抽象类。您可以使用您喜欢的语义制作自己的具体版本。例如,您可以覆盖Visit方法,以便它维护一个它已经看到的节点的HashSet,并且不在它以前接受的节点上调用Accept。以上是C#学习教程:LINQ表达式树适合做树吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

猜你喜欢