我遇到错误:
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();
}
}
所以我想我的问题是,通过一个经常被修改的对象哈希表的最佳方法是什么?
答案 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}}的线程安全等效。