在C#中更新协调的词典

时间:2011-08-10 18:19:41

标签: c# c#-4.0

我有两个字典作为缓存,我们称之为d1d2d2d1的子集。

当我用d1的新条目刷新词典时,我希望刷新d2中的条目。它可以用显而易见的方式完成:

foreach(var update in updates) {
    d1[update.id] = update;
    if(d2.Contains(update.id))
        d2[update.id] = update;
}

但是由于我想缓存其他子集(d3,d4,d5等),这可能会变得难以处理。所以我在我的对象中添加了一个“CopyFrom”方法,它允许我通过简单地将属性复制到正在更新的对象来维护引用。

foreach(var update in updates) {
    d1[update.id].CopyFrom(update)
}

通过这种方式,当d1更新时,任何其他引用该条目的词典都不会丢失。

我想知道我在这里遗失了什么吗?我只是在休息之后回到C#,而我对明显的把握可能是不稳定的:)。

3 个答案:

答案 0 :(得分:2)

为什么没有包含有效负载的CacheItem类(字典中的当前值)。然后,对于词典中的每个键,存储一个包含当前存储内容的CacheItem。如果将相同的CacheItem对象存储在多个字典中,则只需要修改CacheItem的有效负载,并更新包含它的所有字典。

foreach(var update in updates) {
    if (d1.ContainsKey(update.id)) {
        var cacheItem = d1[update.id];
        cacheItem.Payload = update;
    } else {
        d1[update.id] = new CacheItem(update);
    }
}

我的回答是假设您拥有多个词典的设计,有些是主要词典的子集,这是基于您的要求,并且是解决这些词典的合理方法。这对我来说似乎有点不寻常。

答案 1 :(得分:1)

如果Dictionary的值是引用类型,并且您只是修改它,那么您将不需要执行任何操作。如果要创建新引用或它是值类型,我会将子集更改为id类型的数组,这是您想要的子集。无论什么时候需要这个值,你都会去d1进行访问。

答案 2 :(得分:0)

至于所有类型的缓存,请记住a cache with a bad policy is another name for a memory leak

此外:Caching Implies Policy