在foreach循环中修改Dictionary的内容

时间:2014-08-06 15:59:09

标签: c# dictionary foreach

当我遇到某个条件时,我试图在foreach循环中更新C#Dictionary的内容。

foreach (KeyValuePair<int, Corpus_22_04_2014_StreetTable_Row> entry in id_StreetNameDictionary)
{
    if(something_happens())
    {
         Corpus_22_04_2014_StreetTable_Row r = entry.Value;
         //Modify r
         id_StreetNameDictionary[entry.Key] = r;
    }
}

这会抛出一个InvalidOperationException,声明&#34; Collection已被修改;枚举操作可能无法执行。&#34;。似乎我们不允许在foreach循环中修改Dictionary的内容。

可能的解决办法是什么?

4 个答案:

答案 0 :(得分:4)

您只需在字典上使用ToList即可将每个键值对复制到列表中。然后迭代该列表而不是Dictionary

foreach (var entry in id_StreetNameDictionary.ToList())
{
    if(something_happens())
    {
         Corpus_22_04_2014_StreetTable_Row r = entry.Value;
         //Modify r
         id_StreetNameDictionary[entry.Key] = r;
    }
}

答案 1 :(得分:2)

创建所有密钥的列表并迭代它。例如:

foreach (var key in id_StreetNameDictionary.Keys.ToList())
{
    if(something_happens())
    {
         var r = id_StreetNameDictionary[key];
         //Modify r
         id_StreetNameDictionary[key] = r;
    }
}

这比从字典中创建KeyValuePair结构列表更有效。

答案 2 :(得分:1)

因为看起来你真的想要修改而不一定是Dictionary,所以直接这样做:

foreach (var entry in id_StreetNameDictionary)
{
    if (something_happens())
    {
        ((Corpus_22_04_2014_StreetTable_Row)entry.Value)["FieldToChange"] = newValue;
        //...repeat for each field to change...you will be altering the row directly, no need to reassign it
    }
}

答案 3 :(得分:0)

我使用以下解决方法。可能效率不高,但它确实有效。 我宣布三个词典:

Dictionary<int, Corpus_22_04_2014_StreetTable_Row> id_StreetNameDictionary = new Dictionary<int, Corpus_22_04_2014_StreetTable_Row>();
Dictionary<int, Corpus_22_04_2014_StreetTable_Row> tempDictionary = new Dictionary<int, Corpus_22_04_2014_StreetTable_Row>();
Dictionary<int, Corpus_22_04_2014_StreetTable_Row> swapBuffer;

我将旧字典(包含所有已修改和未修改的键/值对)完全转储到tempDictionary中。然后我交换了两个词典并清除了未使用的词典:

foreach (var entry in id_StreetNameDictionary)
{
    Corpus_22_04_2014_StreetTable_Row row = id_StreetNameDictionary[entry.Key];
    if (something_happens())
    {

        //Modify row
    }
    tempDictionary.Add(row.id, row);

}

swapBuffer = tempDictionary;
tempDictionary = id_StreetNameDictionary;
id_StreetNameDictionary = swapBuffer;
tempDictionary.Clear();