使用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“,)
答案 0 :(得分:3)
您可以使用任何类型的对象,只要它是一个实例即可。即使是代表,但我不建议使用代理作为密钥,因为它们不是为此而设计的。我不确定独立创建的委托是否会生成相同的哈希代码,如果可以进行比较(等于),则更少。
答案 1 :(得分:0)
这可能是一个延伸,但使用动态语言运行时(IronPython等),你绝对可以从字典中运行任意代码片段。
然后,您可以根据需要动态运行代码,第一次缓存结果,并将缓存结果用于所有将来的调用。
如果你有很多计算,我打赌这最终会表现得很好。尽管如此,我并不确定你想要实现的目标。 :)