更改字典键的最佳方法

时间:2011-06-27 21:49:12

标签: c# dictionary

我想知道是否有更好的方法来更改字典键,例如:

var dic = new Dictionary<string, int>();
dic.Add("a", 1);

后来我决定将键值对设为(“b”,1),是否可以重命名键而不是添加新的键值对(“b”,1)然后删除“a”?

提前致谢。

4 个答案:

答案 0 :(得分:58)

不,一旦添加到词典中,就无法重命名键。如果您想要重命名工具,可以添加自己的扩展方法:

public static void RenameKey<TKey, TValue>(this IDictionary<TKey, TValue> dic,
                                      TKey fromKey, TKey toKey)
{
  TValue value = dic[fromKey];
  dic.Remove(fromKey);
  dic[toKey] = value;
}

答案 1 :(得分:18)

c#中的Dictionary实现为哈希表。因此,如果您能够通过某种Dictionary.ChangeKey方法更改密钥,则必须重新输入该条目。因此,除了删除条目,然后再使用新密钥再次添加条目时,它实际上并没有任何不同(除了方便)。

答案 2 :(得分:6)

public static bool ChangeKey<TKey, TValue>(this IDictionary<TKey, TValue> dict, 
                                           TKey oldKey, TKey newKey)
{
    TValue value;
    if (!dict.TryGetValue(oldKey, out value))
        return false;

    dict.Remove(oldKey);  // do not change order
    dict[newKey] = value;  // or dict.Add(newKey, value) depending on ur comfort
    return true;
}

与Colin的答案相同,但不会抛出异常,而是在失败时返回false。事实上,我认为这样的方法应该是字典类中的默认值,因为编辑键值是危险的,所以类本身应该给我们一个安全的选项。

答案 3 :(得分:5)

你喜欢这个简单的代码吗?

var newDictionary= oldDictionary.ReplaceInKeys<object>("_","-");
  

在所有密钥中将'_'替换为'-'

如果

  • key的类型为string

  • 您希望替换字符串,并在字典的所有键中使用其他字符串

然后以我的方式使用

您只需将以下类添加到您的应用中:

public static class DicExtensions{

    public static void ReplaceInKeys<TValue>(this IDictionary<string, TValue> oldDictionary, string replaceIt, string withIt)
    {
          // Do all the works with just one line of code:
          return oldDictionary
                 .Select(x=> new KeyValuePair<string, TValue>(x.Key.Replace(replaceIt, withIt), x.Value))
                 .ToDictionary(x=> x.Key,x=> x.Value);
    }
}
  

我使用 Linq 更改字典键(通过linq重新生成字典)

     

神奇的步骤是 ToDictionary() 方法。

  

注意:我们可以制作一个高级 选择 ,为复杂的案例包含一个代码块,而不是简单的lambda。

Select(item =>{
            .....Write your Logic Codes Here....

            return resultKeyValuePair;
       })