如何在循环中更改字典的值

3
我该如何修改字典中的值?我想在循环字典时重新分配一个值给字典中的一个值,就像这样:
for (int i = 0; i < dtParams.Count; i++)
{
   dtParams.Values.ElementAt(i).Replace("'", "''");
}

这里的dtParams是我的Dictionary

我想要做类似于这样的操作:

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

可能是重复的问题:如何迭代字典并更改值? - SwDevMan81
它们很相似但并不完全相同,而且在如何迭代字典并更改值的解决方案中,这个解决方案对我不起作用。 - Anyname Donotcare
4个回答

8
字符串的Replace函数返回一个新的修改后的字符串,因此您需要进行类似以下的操作:
foreach (var key in dtParams.Keys.ToArray())
{
   dtParams[key] = dtParams[key].Replace("'", "''");
}

编辑:

解决了“集合已被修改”问题(如果您访问已存在的键,则我认为不会发生此问题...)


异常: 集合已被修改;枚举操作可能无法执行。 - Anyname Donotcare
1
尝试使用for循环或创建一个新的字典并向其中添加元素,而不是删除。在foreach循环中,您不能修改集合的成员。 - Pabuc

3
你不能直接这样做;在枚举集合时无法修改它(此外,避免在此处使用ElementAt;这是一个面向对象的LINQ扩展方法,在整个列表上进行迭代效率低下)。你需要复制键并在副本上进行迭代:
foreach(var key in dtParams.Keys.ToList()) // Calling ToList duplicates the list
{
    dtParams[key] = dtParams[key].Replace("'", "''");
}

如果你需要帮助,最好说明具体是哪里出了问题(错误信息、错误输出等),而不仅仅说“不工作”。 - Adam Robinson
@user418343,它应该能够正常工作,因为这是查看字典集合中每个值并以您想要的方式进行修改的方法之一。您无法使用for循环来完成此特定任务,但可以在单次遍历后跟踪要更改的值,然后仅修改那些值。 - Security Hound

3

当你使用replace时,它会返回一个新的字符串实例,因为字符串是不可变的,所以你需要在replace之后将值分配给字典。


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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接