【问题标题】:get key - value from dict and remove this key从 dict 中获取 key - value 并删除此键
【发布时间】:2014-03-20 19:47:55
【问题描述】:

我有一些代码

muVar = 5782347242-8923423423-3423423432;

比我将它添加到 dict. ex {1: 57, 2 : 82, 3 : 34, 4 : 72, 5 :42, 6 : -, ....} 我尝试获取此 var 的路径

foreach (KeyValuePair<int, string> kvp in myDict)
{
    if (kvp.Value == "-") { myDict.Remove(kvp.Key);  break; }
    foreach (KeyValuePair<string, string> kvp2 in dict2)
    {
        if (kvp.Value == kvp2.Value) var1 += kvp2.Key;
    }
    myDict.Remove(kvp.Key);
}
foreach (KeyValuePair<int, string> kvp in myDict)
{
    if (kvp.Value == "-") { mytDict.Remove(kvp.Key); break; }
    foreach (KeyValuePair<string, string> kvp2 in dict2)
    {
        if (kvp.Value == kvp2.Value) var2 += kvp2.Key;
    }
    myDict.Remove(kvp.Key);
}

但我有一个异常“集合已修改;枚举操作可能无法执行。”;

【问题讨论】:

  • 在格式化您的帖子时请多加小心 - 我确定您的真实代码中没有缩进约 12 个字符的 foreach 正文,因此您的帖子也没有理由这样做。如果您以更传统的方式而不是“同一行中的多个语句”来格式化块,这也会有所帮助......
  • 不清楚您期望的结果是什么。是的,您在删除该项目后遇到了一个异常 - 这在许多其他帖子中都提到过 - 但目前尚不清楚您要实现的目标。
  • 这里的问题可能是 myDict.Remove(kvp.Key);线。在 foreach 语句中,您不应该触摸您的 myDict。这是因为仍在进行中
  • 我需要获得 3 个部分的“muVar”。第一个 5782347242,第二个 8923423423,第三个 3423423432。3 个部分用“-”分隔

标签: c# dictionary


【解决方案1】:

您的 foreach 循环正在使用该集合,因此您不能在循环之间修改它

尝试使用ToList()

    foreach (KeyValuePair<int, string> kvp in myDict.ToList())
{
    if (kvp.Value == "-") { myDict.Remove(kvp.Key);  break; }
    foreach (KeyValuePair<string, string> kvp2 in dict2)
    {
        if (kvp.Value == kvp2.Value) var1 += kvp2.Key;
    }
    myDict.Remove(kvp.Key);
}
foreach (KeyValuePair<int, string> kvp in myDict.ToList())
{
    if (kvp.Value == "-") { mytDict.Remove(kvp.Key); break; }
    foreach (KeyValuePair<string, string> kvp2 in dict2)
    {
        if (kvp.Value == kvp2.Value) var2 += kvp2.Key;
    }
    myDict.Remove(kvp.Key);
}

【讨论】:

    【解决方案2】:

    您必须收集要从字典中删除的所有项目:

    Dictionary<int, string> removeDict = new Dictionary<int, string>();
    
    foreach (KeyValuePair<int, string> kvp in myDict)
    {
        if (kvp.Value == "-") { myDict.Remove(kvp.Key);  break; }
        foreach (KeyValuePair<string, string> kvp2 in dict2)
        {
            if (kvp.Value == kvp2.Value) var1 += kvp2.Key;
        }
        removeDict.Add(kvp.Key);
        //myDict.Remove(kvp.Key);
    }
    foreach (KeyValuePair<int, string> kvp in myDict)
    {
        if (kvp.Value == "-") { mytDict.Remove(kvp.Key); break; }
        foreach (KeyValuePair<string, string> kvp2 in dict2)
        {
            if (kvp.Value == kvp2.Value) var2 += kvp2.Key;
        }
        removeDict.Add(kvp.Key);
        //myDict.Remove(kvp.Key);
    }
    

    然后将它们从字典中删除:

    foreach (KeyValuePair<int, string> kvp in removeDict)
    {
        myDict.Remove(kvp );
    }
    

    【讨论】:

      【解决方案3】:

      您不能在foreach 循环中删除或添加某些内容到集合中。但是你从 mydict myDict.Remove(kvp.Key); 中删除一些东西。

      您可以将要删除的密钥保存在列表中,然后再删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-12
        • 2015-11-22
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 2019-02-01
        • 2012-09-02
        相关资源
        最近更新 更多