C#列表检查与值插入问题:CSV处理遇枚举修改异常
解决遍历集合时修改引发的System.InvalidOperationException异常
问题根源
你这段代码存在两个核心问题:
- 遍历集合时修改结构:使用
foreach遍历lines集合的同时,调用lines.Insert(0,"Walmart")修改了集合元素数量,C#的foreach迭代器不允许在枚举过程中修改集合结构(增删元素),因此抛出System.InvalidOperationException。 - 逻辑偏差:原代码会对每一行检查,只要某行不含"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
相关产品推荐
相关产品推荐

