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

C# 更新字典中缓存对象的所有引用,c#,caching,dictionary,reference,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]; 对玛丽的提及不会替换为对凯特的提及,即约翰的经理不会更新 我明白这是

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

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];
对玛丽的提及不会替换为对凯特的提及,即约翰的经理不会更新

我明白这是为什么了——字典上提到凯特,但约翰仍然提到玛丽

有人能提出这样一种方法吗

personCache[2] = new Person(){ID = 2, Name = "Kate"});
是否会产生“预期”结果,并将所有对玛丽的引用替换为对凯特的引用

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

多谢各位

瑞安

“…将产生‘预期’结果”

我相信它已经具备了大多数人对预期结果的考虑。

实现您似乎想要的功能的一种方法是使Person类的Name属性可写,然后执行以下操作:

personCache[2].Name = "Kate";
另一种方法是在Person对象中只存储经理的Id,而不是对经理的引用。即代替:

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
}

为什么不直接搜索
管理器
,并在它指向旧值的地方更新它呢

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;
  }
}

根据缓存更改的频率和构建的成本,您可以更新更改的项(如JaredPar所示),或者使整个缓存无效并重新构建它。如果一次更改可能对缓存中的多个项产生复杂影响,则重建非常有用。对象之间的关系相当复杂。我可以看出,如果我不记得“手动”更新所有引用,就有可能出现错误。我的意思是“预期”,如“当我更新缓存中的对象时,该更新应传播到引用原始对象的所有其他对象”@Ryan,如果更新缓存中的对象(例如更改其名称属性),更新将“传播”。但您描述的是“当我替换缓存中的对象时,所有引用原始对象的其他对象都应该更新为引用新对象”。这不会发生的。是的,我理解。我想问题应该是‘如何将personCache[2]中的引用从对象A更改为对象B的引用?’
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;
  }
}