【问题标题】:how to dynamically change the key in dictionary in c#?如何在c#中动态更改字典中的键?
【发布时间】:2012-08-07 06:28:58
【问题描述】:

我在 c# 中有以下代码,基本上它是一个简单的字典 带有一些键和它们的值。现在我想更新现有的密钥 这本字典带有新的键。有可能吗?

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("00", 2);
dictionary.Add("01", 1);
dictionary.Add("02", 0);
dictionary.Add("03", -1);

在某些情况下,我删除了键 01 的值。

现在我必须更新已删除密钥下方的密钥,如下所示。

dictionary.Add("00", 2);   
dictionary.Add("01", 0);
dictionary.Add("02", -1);

有可能吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    这表明您完全错误地使用了字典。字典是键和值之间的映射。如果我们从“the”词典(有词的东西)中删除一个词,定义不会全部移动一个词!

    要做你想做的事,只需使用一个列表,并使用 index 代替你当前使用 key 的方式:

    var list = new List<int>();
    list.Add(2);
    list.Add(1);
    list.Add(0);
    list.Add(-1);
    //...
    list.RemoveAt(1);
    

    现在列表是 {index, value}:{0, 2}, {1, 0}, {2, -1}

    【讨论】:

    • 然后他可以将它们转换为以索引为键、值为值的字典。
    • @NikhilAgrawal 是的,但是当您可以使用列表索引器时,为什么要这样做,即 list[2] = 8; Console.WriteLine(list[0]);
    【解决方案2】:

    你为什么首先使用字典?看起来您应该使用列表或数组。

    【讨论】:

    • 其实我的要求是
    • 我必须为图表中的每个图表系列添加属性窗口。该系列可以在任何图表区域中,例如chartarea1,chartarea2 ...可能有任何系列。我添加了基于索引chartareano+seriesno。这里我的实际问题是在删除系列时应该删除相应的属性。以及其他属性窗口索引应减少 seriesno-1。
    • 我不得不承认我并不完全了解您的需求。而且我仍然不相信字典是最好的结构。从它的声音来看,您应该为所有对象分配正确的 ID,并且永远不要通过它们在数据结构中的索引来引用它们。从字典中删除一个元素不应影响其他元素。
    【解决方案3】:

    你想要一个“AddOrUpdate”方法:

    static class DictionaryExtensions
    {
        public static void AddOrUpdate<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key, TValue value)
        {
            if (dict.ContainsKey(key))
            {
                dict[key] = value;
            }
            else
            {
                dict.Add(key, value);
            }
        }
    }
    

    然后这样称呼它:

    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    dictionary.AddOrUpdate("00", 2);
    

    【讨论】:

    • 这个问题似乎更多地与 removing 时的不寻常意图有关;看看删除01(在问题中)后键/值如何变化
    • 这与问题无关。按照您的方法,只需 AddOrUpdatedict[key] = value; 就足够了。
    【解决方案4】:

    您可以这样做,但是如果您删除密钥然后再次添加它,您将获得相同的效果。 Dictionary 是使用哈希表实现的,因此如果您以某种方式更改了键,则必须重新哈希该条目。

    这是您可能如何去做的扩展(类似于引用的 SO 问题):

    public static UpdateKeyName<TKey, TValue>(Dictionary<TKey, TValue> dic this,
                                          TKey fromKey, TKey toKey)
    {
      TValue value = dic[fromKey];
      dic.Remove(froKeym);
      dic[toKey] = value;
    }
    

    可以在此处找到有关 c# 字典的更多信息:

    【讨论】:

    • 这与问题无关。
    猜你喜欢
    • 2021-02-01
    • 2010-12-28
    • 2015-09-23
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2017-02-03
    相关资源
    最近更新 更多