假设我在C#中有一个简单的类Cat
,类型的属性为string
。现在我需要为我的猫收集类,所以我决定将Dictionary<string, Cat>
包装在自定义集合类中。基本上,这个类包含一个私有字典变量,添加或通过其名称中删除集合成员的需要,以及索引猫:在C#中处理可变集合键
class Cats
{
private Dictionary<string, Cat> m_dic = new Dictionary<string,Cat>();
public void Add(Cat c)
{
m_dic.Add(c.Name, c);
}
public void Remove(string name)
{
m_dic.Remove(name);
}
public Cat this[string name]
{
get
{
return m_dic[name];
}
}
}
现在我可以创建一个收集和猫,就像这样:
Cats cs = new Cats();
cs.Add(new Cat("Valentina"));
cs.Add(new Cat("Sophie"));
cs.Add(new Cat("Tomboy"));
而且我可以检索从它的名字猫:
Cat c1 = cs["Sophie"];
这一切都非常好。问题是,当我改名字的猫,像这样:
c1.Name = "Sofia";
...通过c1
引用的对象集合为不更新,看样子。所以,如果我尝试使用新名称来检索相同的项目,我得到一个异常:
Cat c2 = cs["Sofia"]; //KeyNotFoundException is thrown here.
这是由运行时正确的和明显的行为。我的问题是:你是否可以建议一个优雅可靠的方法来改变集合键,只要元素的name属性发生变化?
我的目标是能够随时从其名称中检索一个项目,就像你想象的那样。我已经通过让Name
属性的setter引发一个事件来处理这个问题,这样任何保存该对象的集合都可以更新相应的键。不过,这种方法相当麻烦并且效率不高。
你能想出更好的东西吗?谢谢。
请参阅下面编辑我的帖子。 – 2009-11-20 19:13:10