我想知道是否有更好的方法来更改字典键,例如:
var dic = new Dictionary<string, int>();
dic.Add("a", 1);
后来我决定将键值对设为(“b”,1),是否可以重命名键而不是添加新的键值对(“b”,1)然后删除“a”?
提前致谢。
答案 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;
})