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

时间:2009-07-15 13:54:31

标签: c# caching dictionary lambda

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

例如,从我的different question改变我的基本缓存:

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();
    }
}

这会工作吗?

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用任何类型的对象,只要它是一个实例即可。即使是代表,但我建议使用代理作为密钥,因为它们不是为此而设计的。我不确定独立创建的委托是否会生成相同的哈希代码,如果可以进行比较(等于),则更少。

答案 1 :(得分:0)

这可能是一个延伸,但使用动态语言运行时(IronPython等),你绝对可以从字典中运行任意代码片段。

然后,您可以根据需要动态运行代码,第一次缓存结果,并将缓存结果用于所有将来的调用。

如果你有很多计算,我打赌这最终会表现得很好。尽管如此,我并不确定你想要实现的目标。 :)