更改字典键的最佳方法

Yua*_*uan 26 c# dictionary

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

var dic = new Dictionary<string, int>();
dic.Add("a", 1);
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Col*_*inE 59

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的命名是`ChangeKey`或`UpdateKey` :) (6认同)

Ken*_*nde 19

DictionaryC#中被实现为哈希表.因此,如果您能够通过某种Dictionary.ChangeKey方法更改密钥,则必须重新输入该条目.因此,删除条目,然后使用新密钥再次添加条目并不是真正的(除了方便).

  • +1表示为什么它与他现在所做的没什么不同 (6认同)

naw*_*fal 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;
}
Run Code Online (Sandbox Code Playgroud)

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


RAM*_*RAM 5

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

var newDictionary= oldDictionary.ReplaceInKeys<object>("_","-");
Run Code Online (Sandbox Code Playgroud)

全部替换'_''-'


如果

  • 你的类型keystring

  • 您要用字典的所有键中的其他字符串替换一个字符串

然后用我的方式


您只需要向您的应用添加以下类:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

魔术步骤是ToDictionary()方法。


注意:我们可以使高级Select包含用于复杂情况的代码块,而不是简单的lambda。

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

            return resultKeyValuePair;
       })
Run Code Online (Sandbox Code Playgroud)

  • 使用内存分配这种方法似乎有点快速和松散,不会否决它,但我会纯粹根据内存分配的味道来避免它,只是在我喜欢的事情的危险方面有一点点。 (2认同)