C#表达式比较

Emr*_*urk 7 c# lambda

假设我在集合上有以下表达式:

var people = new List<Person>
{
     new Person {FullName = "Some Dude", Age = 45},
     new Person {FullName = "Another Dude", Age = 28},
     new Person {FullName = "Some Other Dude", Age = 36}
 };

var filtered = people.Where(person => person.Age > 28 && person.FullName.StartsWith("So"));
var narrowlyFiltered = people.Where(person => person.Age > 36 && person.FullName.StartsWith("Some"));
Run Code Online (Sandbox Code Playgroud)

有没有办法比较这两个表达式并推断出第二个表达式是运行时第一个表达式的子集?没有枚举或其他任何东西.我只是有表达式,我试图找出这些表达式是否相交或相互包含.

rdu*_*com 5

你必须将每个Expression分解为所有可能的继承类型(MethodCallExpression,ConditionalExpression等),然后并行地进行每个分解并检查每个可能的参数......编码会有点长......你可以启发来自ExpressionEqualityComparer

  • 我所说的子集是两个表达式树之间的公共节点的小部分,在"几乎相等"的比较中(如果两个节点属于同一类型,但没有完全相同的参数,则可以认为两个节点几乎相等) .它与严格的B-Tree代数无关.有了这种"几乎平等"的概念,是的,我们可以谈到交叉 (2认同)