我正在使用一个词典,我希望在我枚举时更改它,但似乎这是不允许的。 我怎么能这样做?
由于
答案 0 :(得分:10)
基本上不要。它明确不受支持。来自Dictionary<,>.GetEnumerator()
的文档:
只要枚举器仍然有效 该系列保持不变。如果 对集合进行了更改, 例如添加,修改或删除 元素,枚举器是 不可恢复的无效及其 行为未定义。
通常,最好的方法是记住您要进行的修改,然后再执行它们。或者您可以从字典的副本开始,然后在修改原始文件时迭代 。如果您可以向我们提供有关您尝试做的更多信息,那将有所帮助。
话虽如此,.NET 4.0 中的新ConcurrentDictionary
类确实允许这样做 - 但迭代结果无法保证 - 您可能会看到更改迭代,或者你可能没有。
答案 1 :(得分:6)
您应该存储要删除的密钥或对象并中断循环,然后使用remove方法从字典中删除该对象。
希望这有帮助
答案 2 :(得分:1)
关于队列,我回答了here,但答案是一样的。您不能使用foreach枚举并同时修改集合。
答案 3 :(得分:0)
我在工作中遇到了类似的情况。我需要修改字典,同时迭代地将其缩小,直到我没有键/值为止。
我首先创建了一个&#34;要删除的列表&#34;密钥,但是我必须实现所有其他逻辑,这是非常缓慢的。或者,我最后向后遍历字典。由于您从后到前遍历字典,因此迭代不会抛出错误。
在我拿出与工作相关的逻辑后,它看起来很傻,但我保证它有效并且看起来像:
Dictionary<int, List<int>> dict = new Dictionary<int, List<int>>();
while(dict.Any())
{
foreach(var key in dict.Keys.Reverse())
{
if(//conditional)
{
dict.Remove(key);
}
else
{
//do something with dict[key]
}
}
}
答案 4 :(得分:0)
这是我的解决方案,它取决于System.Linq扩展名:
Dictionary<string, bool> _buttons = new Dictionary<string, bool> {
{ "A Button", false },
{ "B Button", false },
{ "X Button", false },
{ "Y Button", false }
};
...
foreach (var button in _buttons.ToArray()) {
var name = button.Key;
var value = CrossPlatformInputManager.GetButton(name);
if (value != button.Value) {
_buttons[name] = value;
}
}
它明确复制到KeyValuePair [],以避免突变错误。