相关疑难解决方法(0)

测试lambda表达式相等性的最有效方法

给定方法签名:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
Run Code Online (Sandbox Code Playgroud)

如果两个表达式相同,最有效的方法是什么?这只需要适用于简单的表达式,我的意思是所有"支持"的都是简单的MemberExpressions,例如c => c.ID.

一个示例调用可能是:

AreTheSame<User>(u1 => u1.ID, u2 => u2.ID); --> would return true
Run Code Online (Sandbox Code Playgroud)

c# lambda

42
推荐指数
2
解决办法
1万
查看次数

有效地消除.NET表达式树中的常见子表达式

我编写了一个DSL和一个从中生成.NET表达式树的编译器.树中的所有表达式都是无副作用的,并且表达式保证是"非语句"表达式(没有本地,循环,块等).(编辑:树可能包括文字,属性访问,标准操作符和函数调用 - 这可能正在做一些奇特的事情,如内部的memoization,但外部副作用是免费的).

现在我想对它执行"Common sub-expression elimination"优化.

例如,给定一个对应于C#lambda的树:

foo =>      (foo.Bar * 5 + foo.Baz * 2 > 7) 
         || (foo.Bar * 5 + foo.Baz * 2 < 3)  
         || (foo.Bar * 5 + 3 == foo.Xyz)
Run Code Online (Sandbox Code Playgroud)

...我想生成树等价的(忽略一些短路语义被忽略的事实):

foo =>
{
     var local1 = foo.Bar * 5;

     // Notice that this local depends on the first one.        
     var local2 = local1 + foo.Baz * 2; 

     // Notice that no unnecessary locals have been generated.
     return local2 > 7 || …
Run Code Online (Sandbox Code Playgroud)

.net c# algorithm optimization expression-trees

17
推荐指数
2
解决办法
1282
查看次数

我如何比较两个lambda表达式?

可能重复:
如何检查两个Expression <Func <T,bool >>是否相同

我需要比较两个lambda表达式,以检查相等性.基本上,以下两个lambda是相同的:

Expression<Func<int, bool>> exp1 = (Foo f) => f.Bar().StartsWith("F");
Expression<Func<int, bool>> exp2 = (Foo b) => b.Bar().StartsWith("F");
Run Code Online (Sandbox Code Playgroud)

我怎样才能检查是否exp1有同样的事情exp2呢?

.net c# lambda

15
推荐指数
1
解决办法
5472
查看次数

内存索引

我有一个Session的概念,它存储各种状态的对象.

有时我需要扫描Session以查找与特定查询匹配的对象,但是我做了很多,性能测试表明它已经成为某些领域的瓶颈.

因此,我想在Session上介绍索引的概念.

就像是...

public IDictionary<K, V> GetIndex<K, V>(Func<V, K> keySelector)
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何像这样测试Func的"相等".显然我希望索引只能在第一次调用GetIndex和后续调用时再构建它.

我应该如何在内部映射这些以进行索引存在查找?

IDictionary<???, IDictionary<K, V>> indexes = ...
Run Code Online (Sandbox Code Playgroud)

基本上我应该如何存储???.也许我不能用Func做到这一点,但也许还有其他方法.

.net c# indexing dictionary

8
推荐指数
1
解决办法
1450
查看次数

比较表达式<T>

可能重复:
C#:检查两个Expression <Func <T,bool >>是否相同

我有一堆Expression<Func<T, bool>>谓词,我想比较它们的平等性.有没有办法做到这一点?

背景:我的库将项目排序为"bins",由谓词是否返回true来控制.如果调用者想要创建一个新的bin,我想看看bin是否已经存在.

.net expression-trees

6
推荐指数
1
解决办法
645
查看次数