正在更新字典中对象类型的键
本文关键字:类型 对象 更新 字典 | 更新日期: 2023-09-27 18:24:52
我对C#和使用字典非常陌生。我想编辑一本字典的关键字键是Group类型的对象。组包含一个公共属性GroupNameGroupName应更改为新的字符串值。我们被要求使用对象而不是字符串作为我们的键。我尝试了以下方法:
***************************SEPERATE COLLECTION CLASS************************
{
public class GroupKeysDictionary : Dictionary<Group, List<Key>> { }
}
*************************************************************************
private static GroupKeysDictionary _groupKeys = new GroupKeysDictionary();
public static class DataAccessMgr {
(Group g contains the original g.
GroupName and k.GroupName is the new group name)
public static void EditGroup(Group g, Group k) {
if (_groupKeys.ContainsKey(g)) {
_groupKeys(g) = k
}
}
我必须删除该组并重新添加它吗?我不想丢失列表中的值。
是的,无论如何,删除键,然后再添加回来。
字典背后的理念是,一旦关键字在字典中,就不应该更改。不要对其进行变异。如果以实质性的*方式修改密钥,则会使密钥的哈希代码无效,然后字典就被有效地破坏了。如果要将该值重新关联到其他键,请使用原始键获取该值,删除该键,然后将新键与该值一起添加回字典。
你可能想试试
if (_groupKeys.ContainsKey(g) && !_groupKeys.ContainsKey(k))
{
var value = _groupKeys[g];
_groupKeys.Remove(g);
_groupKeys.Add(k, value);
}
*这个答案假设Group
类已经实现了自己的GetHashCode
和Equals
方法,这些方法考虑了您选择的主属性GroupName
。如果您的类不提供这样的实现,而是依赖于默认的引用相等,那么键的突变就不会产生同样的有害影响。但是,您的字典也没有那么有用,因为具有相同GroupName
的两个不同实例可以用作键,因为它们在引用上不相等。