假设我有一个简单的类 Cat
在 C# 中,带有 Name
类型属性 string
.现在我的猫需要一个收集类,所以我决定包装一个 Dictionary<string, Cat>
在自定义集合类中。基本上,这个类包含一个私有(private)字典变量,并根据需要添加或删除集合成员,以及按猫的名字索引猫:
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
的 setter 解决了这个问题。属性引发事件,以便任何持有该对象的集合都可以更新相应的键。但是,这种方法非常麻烦且效率不高。
你能想到更好的吗?谢谢。
最佳答案
您的收藏有多大,能够通过索引检索项目有多重要?
如果它相对较小(数百,而不是数千),您最好使用 List<Cat>
,并使用新的 LINQ 扩展方法访问它们,例如:
public Cat this[string name]{
get{
//Will return the first Cat in the list (or null if none is found)
return m_List.Where(c => c.Name == name).FirstOrDefault();
}
}
添加(和删除)也很简单:
public void Add(Cat c){
m_List.Add(c);
}
如果这对您不起作用,请告诉我。希望这对您有所帮助!
关于c# - 在 C# 中处理可变集合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1767804/