在枚举时修改.NET字典

时间:2010-02-27 12:17:51

标签: c# .net

我正在使用一个词典,我希望在我枚举时更改它,但似乎这是不允许的。 我怎么能这样做?

由于

5 个答案:

答案 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 [],以避免突变错误。