正在更新字典中对象类型的键

本文关键字:类型 对象 更新 字典 | 更新日期: 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类已经实现了自己的GetHashCodeEquals方法,这些方法考虑了您选择的主属性GroupName。如果您的类不提供这样的实现,而是依赖于默认的引用相等,那么键的突变就不会产生同样的有害影响。但是,您的字典也没有那么有用,因为具有相同GroupName的两个不同实例可以用作键,因为它们在引用上不相等。