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

标签 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: 不,等等……它实际上没有。好吧,对于常规方法它确实如此。但不适用于 lambda。即使它们看起来相同,它们也会获得各种随机方法名称。哦好吧 c",)

最佳答案

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

关于C#:是否可以使用表达式或函数作为字典中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1131556/

相关文章:

javascript - 如何将媒体从 text/plain 更改为 application/json?

c# - 处置面板相当于处置其子项加上自身吗?

mysql - ServiceStack Ormlite 缓存条目在到期后不会被删除

javascript - 从 map 或其他方式返回值

c# - OpenFileDialog 默认路径

angularjs - 刷新缓存的Angular SPA

javascript - 在浏览器空闲时开始加载下一页

java - 速度模板适合评估条件吗?

iphone - 为什么地址词典中没有邮政编码?

c# - 当前网络请求执行过程中产生了未处理的异常