You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:15:04