更新字典中缓存对象的所有引用

时间:2014-01-23 05:26:07

标签: c# caching dictionary reference

我有一个简单的对象缓存:

Dictionary<int, Person> personCache = ...
personCache.Add(1, new Person(){ID = 1, Name = "John"});
personCache.Add(2, new Person(){ID = 2, Name = "Mary"});

personCache[1].Manager=personCache[2];

(实际上,我对词典进行了适当的封装)

所以现在约翰的经理将被定为玛丽。但是,如果我想用一个新的人物实例替换Mary,如果我这样做

personCache[2] = new Person(){ID = 2, Name = "Kate"});

对Mary的引用不会替换为对Kate的引用 - 即John的经理未更新。

我可以看出为什么会这样 - 字典中提到了凯特,但约翰仍然提到了玛丽。

任何人都可以建议这样的方式

personCache[2] = new Person(){ID = 2, Name = "Kate"});

是否会有'预期'的结果并将所有对Mary的引用替换为Kate?

我想我需要获取存储在personCache [2]中的引用,将该引用更改为新人。

谢谢

赖安

2 个答案:

答案 0 :(得分:1)

为什么不直接搜索Manager并将其更新为指向旧值的位置

Person oldPerson = personCache[2];
Person newPerson = new Person() { ID = 2, Name = "Kate" };
personCache[2] = newPerson;
foreach (var pair in personCache) { 
  if (pair.Value.Manager == oldPerson) { 
    pair.Vaulue.Manager = newPerson;
  }
}

答案 1 :(得分:0)

  

“......会有'预期的'结果”

我相信大多数人都会考虑预期的结果。

实现您想要的内容的一种方法是使Person类的Name属性可写,然后执行:

personCache[2].Name = "Kate";

另一种方法是在Person对象中仅存储管理器的Id,而不是对Manager的引用。即而不是:

personCache[1].Manager = personCache[2];

你可以:

personCache[1].ManagerId = 2;

例如,您可以使用扩展方法获取人员的管理员:

public static Person GetManager(this Person person)
{
    if (person == null) throw new ArgumentNullException("person");
    Person manager;
    personCache.TryGetValue(person.ManagerId, out manager);
    return manager; // returns null if not found in cache
}