C#:是否可以将表达式或函数用作字典中的键?

Svi*_*ish 7 c# lambda caching dictionary

是否可以使用Expression<Func<T>>Func<T>作为字典中的键?例如,缓存重度计算的结果.

例如,从我的一个不同的问题改变我的基本缓存:

public static class Cache<T>
{
    // Alternatively using Expression<Func<T>> instead
    private static Dictionary<Func<T>, T> cache;
    static Cache()
    {
        cache = new Dictionary<Func<T>, T>();
    }
    public static T GetResult(Func<T> f)
    {
        if (cache.ContainsKey(f))
            return cache[f];

       return cache[f] = f();
    }
}
Run Code Online (Sandbox Code Playgroud)

这甚至会起作用吗?

编辑:经过快速测试后,它似乎确实有效.但我发现它可能更通用,因为它现在每个返回类型一个缓存...不知道如何更改它以便不会发生...嗯

编辑2: Noo,等等......实际上并没有.嗯,对于常规方法,它确实如此.但不适用于lambdas.即使它们看起来相同,它们也会获得各种随机方法名称.哦,好吧c",)

Cec*_*ame 3

您可以使用任何类型的对象,只要它是实例即可。即使是代表,但我不建议使用代表作为键,因为它们不是为此设计的。我不确定独立创建的委托会产生相同的哈希码,如果可以比较(可相等),甚至会更少。