轻松解决“集合已修改”难题:循环中避免列表修改
在编程过程中,遇到令人沮丧的“集合已修改;枚举操作可能无法执行”错误时,程序员常常会感到困惑,尤其是在调试器下问题仍然难以察觉时。但是,不用担心,解决方法在于理解在出错循环中潜在的列表更改。
此错误发生在循环迭代集合时修改集合中的元素时。在提供的WCF服务器代码片段中,“订阅者”字典在“NotifySubscribers”方法的“foreach”循环中被修改。具体来说,当“SignalData”方法间接修改字典时,就会导致此错误。
为了解决这个问题,我们可以在循环之前使用“ToList()”方法将字典的值转换为新的列表,从而避免“集合已修改”的陷阱。这将创建一个独立于原始字典的单独列表,确保在循环期间对其进行的更改不会影响迭代过程。
以下是调整代码的方法:
<code class="language-c#">private static readonly IDictionary<Guid, Subscriber> subscribers = new Dictionary<Guid, Subscriber>(); ... public void NotifySubscribers(DataRecord sr) { foreach (Subscriber s in subscribers.Values.ToList()) // 将值复制到单独的列表中 { try { s.Callback.SignalData(sr); } catch ... } }</code>
通过使用此技术,循环不再操作原始字典,而是操作独立副本。这消除了并发修改的可能性,并防止了令人讨厌的“集合已修改”错误。
以上是通过C#中的字典迭代时,如何解决'收集已修改”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!