【问题标题】:how to change the value of dictionary during looping如何在循环期间更改字典的值
【发布时间】:2011-05-22 06:20:27
【问题描述】:

如何修改字典中的值?我想在我的字典上循环时将一个值重新分配给我的字典中的一个值,如下所示:

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

dtParams 是我的Dictionary

我想做这样的事情:

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

【问题讨论】:

标签: c# .net asp.net collections


【解决方案1】:

字符串替换函数返回一个新的修改后的字符串,所以你必须这样做:

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

编辑:

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

【讨论】:

  • 异常:: 集合被修改;枚举操作可能无法执行。
  • 尝试使用 for 循环或创建一个新 Dictionary 并将其添加到其中而不是删除。您不能在 foreach 循环中修改集合的成员。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你不能直接这样做;枚举时不能修改集合(另外,请避免在此处使用 ElementAt;这是一种 LINQ to Objects 扩展方法,对于遍历整个列表效率低下)。您必须复制密钥并对其进行迭代:

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

    【讨论】:

    • @user418343:如果您需要帮助,如果您说如何它不起作用(错误消息、错误输出等)会更容易,而不是只是说“也不起作用”。
    • @user418343 它应该可以工作,因为这是查看字典集合中每个值并以您希望的方式进行修改的方法之一。您将无法对这个特定任务使用 for 循环,您可以跟踪要更改的值,然后仅在一次通过后修改这些值。
    【解决方案4】:

    一个小的 lambda 将有很长的路要走。 ;)

    我将它放入 LINQPad 并为您进行了测试。所有集合都有 .To[xxx] 方法,因此您可以在 1 行中轻松完成此操作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多