C#循环中修改Plott类Headers列表内字符串触发集合修改报错如何解决
问题原因
- C#中
foreach遍历依赖集合的枚举器实现,枚举器启动遍历时会记录当前集合的版本号,只要原集合发生任何修改(包括元素赋值、增删元素等操作),版本号就会更新,下次枚举器执行MoveNext()时检测到版本不匹配,就会抛出集合已修改的异常。 - 你的代码在
foreach (String s in obj.Headers)的遍历过程中直接对obj.Headers[c]赋值,触发了集合版本更新,因此触发报错。
解决方案
方案1:内层遍历替换为for循环(推荐)
for循环直接通过索引访问元素,不依赖枚举器,不会触发版本检测,性能最优,修改后代码如下:
foreach (Plott obj in plt) { for (int c = 0; c < obj.Headers.Count; c++) { if (obj.Headers[c].Contains("aaa")) { obj.Headers[c] = obj.Headers[c].Replace("aaa", "bbb"); } } }
方案2:遍历Headers的副本
如果需要保留foreach写法,可以先生成Headers的副本用于遍历,修改操作作用在原集合上,遍历的副本不受原集合修改影响,代码如下:
foreach (Plott obj in plt) { int c = 0; // ToList()生成原集合的副本 foreach (String s in obj.Headers.ToList()) { if (s.Contains("aaa")) { obj.Headers[c] = s.Replace("aaa", "bbb"); } c++; } }
内容的提问来源于stack exchange,提问作者kPuck
相关产品推荐
相关产品推荐

