【问题标题】:Updating the Key of Object type in a Dictionary更新字典中对象类型的键
【发布时间】:2012-02-16 04:23:36
【问题描述】:

我对 C# 非常陌生,并且使用字典。 我想编辑字典的键,其中 Key 是 Group 类型的对象。组包含一个公共属性 GroupName GroupName 应更改为新的字符串值。我们需要使用对象而不是字符串作为我们的键。我尝试了以下方法:

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

我必须删除组并重新添加吗? 我不想丢失列表中的值。

【问题讨论】:

    标签: c#


    【解决方案1】:

    是的,无论如何,删除密钥然后将其添加回来。

    字典背后的想法是,键一旦在字典中就不应更改。不要变异它。如果以实质性*方式修改密钥,它会使密钥的哈希码无效,然后字典就会被有效地破坏。如果要将值重新关联到不同的键,请使用原始键获取值,删除键,然后将 new 键与值一起添加回字典。

    你可能想尝试的是

    if (_groupKeys.ContainsKey(g) && !_groupKeys.ContainsKey(k))
    {
         var value = _groupKeys[g];
         _groupKeys.Remove(g);
         _groupKeys.Add(k, value);
    }
    

    *此答案假定您的 Group 类已经实现了自己的 GetHashCodeEquals 方法,这些方法考虑了您选择的主要属性 GroupName。如果你的类不提供这样的实现,而是依赖于默认的引用相等,那么键的突变不会产生同样的有害影响。但是你的字典也没有那么有用,因为两个具有相同 GroupName 的不同实例可以用作键,因为它们在引用上不相等。

    【讨论】:

    • 这听起来很像是属于扩展方法。
    • @M.Babcock,当然,但在提供答案方面有点过头了(尽管如果他们愿意,有人可以将它放在扩展方法中,也许使用签名 public static bool ReplaceKey&lt;TKey, TValue&gt;(this Dictionary&lt;TKey, TValue&gt; dictionary, TKey originalKey, TKey newKey) 方法返回 true /false 如果密钥可以交换),但我目前不打算随便提倡扩展方法。
    • @AnthonyPegram - 我理解这个问题没有明确要求扩展方法,我的意思是它可以推广到很多情况下工作。我知道你知道这一点(我已经有一个扩展方法可以做到这一点),但对于 OP 和未来的读者来说,他们可能不知道这是可能的。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2012-12-31
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多