如何在循环期间更改字典的值

时间:2010-12-08 14:11:12

标签: c# .net asp.net collections

如何修改Dictionary中的值?我想在我的字典中循环一个值,同时在我的字典上循环,如下所示:

for (int i = 0; i < dtParams.Count; i++)
{
   dtParams.Values.ElementAt(i).Replace("'", "''");
}

其中dtParams是我的Dictionary

我想做一些这样的事情:

string a = "car";    
a = a.Replace("r","t");

4 个答案:

答案 0 :(得分:8)

字符串Replace函数返回一个新的修改后的字符串,因此您必须执行以下操作:

foreach (var key in dtParams.Keys.ToArray())
{
   dtParams[key] = dtParams[key].Replace("'", "''");
}

编辑:

解决了该集合被修改的问题(如果您访问已存在的密钥,我认为不会发生这种情况......)

答案 1 :(得分:3)

当你使用replace时,它将返回一个新的字符串实例,你需要在替换之后在字典中赋值,因为字符串在本质上是不可变的

答案 2 :(得分:3)

你不能直接这样做;你在枚举时不能修改集合(同样,避免在这里使用ElementAt;这是一个LINQ to Objects扩展方法,并且迭代整个列表效率很低)。你必须复制密钥并对其进行迭代:

foreach(var key in dtParams.Keys.ToList()) // Calling ToList duplicates the list
{
    dtParams[key] = dtParams[key].Replace("'", "''");
}

答案 3 :(得分:1)

一个小小的lambda会走很长的路。 ;)

我把它放到了LINQPad中并为你测试了它。所有的集合都有.To [xxx]方法,所以你可以很容易地在一行中完成这个。

var dtParams = new Dictionary<string, string>();
dtParams.Add("1", "'");
dtParams.Add("a", "a");
dtParams.Add("b", "b");
dtParams.Add("2", "'");
dtParams.Add("c", "c");
dtParams.Add("d", "d");
dtParams.Add("e", "e");
dtParams.Add("3", "'");

var stuff = dtParams.ToDictionary(o => o.Key, o => o.Value.Replace("'", "''"));
stuff.Dump();