foreach循环 - 集合被修改异常

时间:2014-07-27 23:08:25

标签: c# loops exception collections foreach

我遇到错误:

  

System.InvalidOperationException:修改了集合;枚举操作可能无法执行。

在我的代码中,有不断需要读取和删除的字符,对象等的哈希表。我的代码使用foreach循环来对哈希表中的所有值执行某些操作,但是假设一个字符在foreach循环时注销...并且哈希表被修改...繁荣,错误。

请注意,直接修改哈希表的任何foreach代码都会被复制到列表中,并且从那里编辑父列表,这不是问题。问题是读取不断编辑的哈希表。

所以我理解问题是什么,而不是解决它的最佳方法。这是一个简单的代码示例,偶尔会抛出一个集合修改错误:

foreach (Character CC in World.H_Chars.Values)
{
   if (CC.MyGuild != null && CC.MyGuild.GuildName != G.GuildName
      && CC.MyGuild.Allies.ContainsValue(G.GuildName))
   {
      CC.MyClient.AddSend(Data); // error on this line
      CC.MyClient.EndSend();
   }
}

所以我想我的问题是,通过一个经常被修改的对象哈希表的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

So I guess my question is what's the best way to go through a Hashtable of Objects that's constantly being modified?

我怀疑最好的方法不是。 :)

考虑以另一种方式看问题。例如,我看到你正在寻找具有某些特征的数据,这可能是因为你提到的哈希表的不断修改。这些修改是事件。如果您可以安排诸如能够首先对这些事件作出反应的事情,那将解决随后存储的不断变化的哈希表的问题。

答案 1 :(得分:0)

您可以尝试使用System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>。这是一个关键:值对数据结构是线程安全的(例如,它是一个通用的HashTable类型实现 - 它有O(1)元素查找)。它可以在枚举时更新。但是,你需要注意的是,在枚举这种类型的集合时,你可能会得到“肮脏的”#34;读取(即,您迭代的集合是迭代开始时字典的快照 - 因此,在您开始迭代之后发生的更新可能在集合的当前迭代中不可见)。

还有一个System.Collections.Concurrent.ConcurrentBag<T>与[{1}}的线程安全等效。