我有一个简单的对象缓存:
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]中的引用,将该引用更改为新人。
谢谢
赖安
答案 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
}