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

C#列表检查与值插入问题:CSV处理遇枚举修改异常

解决遍历集合时修改引发的System.InvalidOperationException异常

问题根源

你这段代码存在两个核心问题:

  1. 遍历集合时修改结构:使用foreach遍历lines集合的同时,调用lines.Insert(0,"Walmart")修改了集合元素数量,C#的foreach迭代器不允许在枚举过程中修改集合结构(增删元素),因此抛出System.InvalidOperationException。
  2. 逻辑偏差:原代码会对每一行检查,只要某行不含"Walmart"就往头部插入新行,最终会生成大量重复行,完全不符合"添加缺失列"的需求——实际应该检查表头行是否包含"Walmart"列名,而非插入整行。

修正方案(正确添加列)

CSV的列名通常在第一行,只需检查表头行,若缺失则添加列名,并给数据行补充对应空值(按需调整):

string[] vs = File.ReadAllLines(@"C:/Users/Raw.csv");
var lines = vs.ToList();

if (lines.Count > 0)
{
    string header = lines[0];
    // 按CSV分隔符(这里假设是逗号)拆分列名,避免误判列名包含Walmart子串的情况
    string[] columnNames = header.Split(',');
    
    if (!columnNames.Contains("Walmart"))
    {
        // 在表头末尾添加Walmart列名,可根据需求调整插入位置
        lines[0] = header + ",Walmart";
        
        // 给所有数据行补充该列的空值(如果数据行没有对应值)
        for (int i = 1; i < lines.Count; i++)
        {
            lines[i] += ","; // 若需要填充默认值可改为 ",默认值"
        }
    }
}

// 输出验证
foreach (var shw in lines)
{
    Console.WriteLine(shw);
}

仅解决遍历异常的方案(保留原逻辑框架)

如果必须遍历集合,可改用for循环(基于索引访问,不会触发迭代器的修改检测),同时优化逻辑避免重复插入:

string[] vs = File.ReadAllLines(@"C:/Users/Raw.csv");
var lines = vs.ToList();

// 先遍历检查是否存在包含Walmart的行
bool hasWalmart = false;
for (int i = 0; i < lines.Count; i++)
{
    if (lines[i].Contains("Walmart"))
    {
        hasWalmart = true;
        break;
    }
}

// 仅当完全不存在时才插入
if (!hasWalmart)
{
    lines.Insert(0, "Walmart");
}

// 输出验证
foreach (var shw in lines)
{
    Console.WriteLine(shw);
}

内容的提问来源于stack exchange,提问作者Antonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:09:25