Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中使用字典时出错#_C#_Asp.net_Exception_Dictionary - Fatal编程技术网

C# 在c语言中使用字典时出错#

C# 在c语言中使用字典时出错#,c#,asp.net,exception,dictionary,C#,Asp.net,Exception,Dictionary,我试图搜索字典,看看它是否有一定的价值,如果有,然后改变它。 这是我的密码: foreach (var d in dictionary) { if (d.Value == "red") { d.Value = "blue"; } } 在VisualStudio中,当我逐步调试代码时,我可以看到它更改了值,然后当它再次点击foreach循环进行重申时,它会抛出一个异常 “集合已修改;枚举操作可能无法执行” 如何修复此问题?如果要替换所有出现的“红色”,则

我试图搜索字典,看看它是否有一定的价值,如果有,然后改变它。 这是我的密码:

foreach (var d in dictionary)
{
    if (d.Value == "red")
    {
         d.Value = "blue";
    }
}
在VisualStudio中,当我逐步调试代码时,我可以看到它更改了值,然后当它再次点击foreach循环进行重申时,它会抛出一个异常

“集合已修改;枚举操作可能无法执行”


如何修复此问题?

如果要替换所有出现的“红色”,则需要将KeyValuePairs存储在列表或类似列表中:

var redEntries = dictionary.Where(e => e.Value == "red").ToList();
foreach (var entry in redEntries) {
    dictionary[entry.Key] = "blue";
}

你不能在前段时间改变它——你需要想出一些其他的机制,比如:

// Get the KeyValuePair items to change in a separate collection (list)
var pairsToChange = dictionary.Where(d => d.Value == "red").ToList();
foreach(var kvp in pairsToChange)
    dictionary[kvp.Key] = "blue";

在循环中枚举集合时,不能修改集合

您需要将更改添加到集合中,然后分别进行更改。比如:

var itemsToChange = dictionary
    .Where(d => d.Value == "red")
    .ToDictionary(d => d.Key, d => d.Value);

foreach (var item in itemsToChange)
{
    dictionary[item.Key] = "blue";
}

不能在
foreach
循环中修改正在迭代的集合。如果你能做到这一点,就会出现一些问题,比如“我是否也在这个新增加的价值上运行它?”

相反,您应该这样做:

foreach( string key in dictionary.Keys )
{
    if( dictionary[key] == "red" )
    {
        dictionary[key] = "blue";
    }
}

foreach循环中的对象是只读的

请通读并进一步理解。

var dict=new Dictionary()
var dict = new Dictionary<string, string>()
          {
                  { "first", "green" },
                  { "second", "red" },
                  { "third", "blue" }
          };

foreach (var key in dict.Keys.ToArray())
{
    if (dict[key] == "red")
    {
        dict[key] = "blue";
    }
}
{ {“第一”,“绿色”}, {“第二”,“红色”}, {“第三”,“蓝色”} }; foreach(dict.Keys.ToArray()中的var键) { 如果(dict[键]=“红色”) { dict[key]=“蓝色”; } }
这适用于简单的情况,正如这里所问的那样。然而,如果涉及的不仅仅是一个简单的值检查,那么这也不会起作用。您喜欢这种方法有什么原因吗?这种方法可能会将内存使用量增加一倍,而不是像我建议的那样(迭代密钥)?@mattytommo这是一个
列表
-kvp将是一个KeyValuePair,并具有密钥属性。这是因为
Dictionary
IEnumerable
-@Jeff您的解决方案实际上给出了完全相同的错误-您不能在枚举键时更改字典…这是正确的,但毫无帮助。你已经告诉了他问题是什么,但没有给出解决问题的线索。@Jeff纠正Jeff,也应该发布解决方案。粘贴这两个链接以帮助Brian理解底层机制。这会产生相同的错误。您必须复制键才能进行枚举。这是可行的,但是在这里制作字典比在
列表中制作字典要贵得多。ReedCopsey到底有多贵?它们都有一些开销,但我敢打赌成本上的差异很小。如果我没记错的话,一个字典在堆上有5个额外的托管分配,加上你要为循环和提取键和值等所需的闭包创建类。对大多数事情来说可能并不重要,但它比一个简单的列表要复杂得多。你是对的,在大多数情况下,它可能根本不明显,但它是一个更复杂的问题。