-2

我在 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);

是否可以?

4

4 回答 4

5

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

要做你想做的事,只需使用一个列表,并使用索引来代替你当前使用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}

于 2012-08-07T06:33:09.203 回答
1

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

于 2012-08-07T06:34:44.817 回答
0

你想要一个“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);
于 2012-08-07T06:33:37.330 回答
0

您可以这样做,但是如果您删除密钥然后再次添加它,您将获得相同的效果。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# 中字典的更多信息:

于 2012-08-07T06:38:01.853 回答