如何使用LINQ在C#的List中插入指定文本
LINQ实现方案
LINQ更擅长生成新集合而非直接修改原集合,以下是两种符合需求的实现方案:
方案1:处理所有匹配的目标行
如果文本中存在多个包含arr ff_test的行,此方案会在每个目标行的前一行插入指定内容:
var lines = File.ReadAllLines(buildOutFile); var targetKeyword = "arr ff_test"; var insertLines = new[] { "West: &West", " **arr ff_test**", "DcName RD1" }; var result = lines .Select((line, index) => new { Line = line, Index = index }) .SelectMany(item => { // 判断下一行是否为目标行(避免索引越界) if (item.Index < lines.Length - 1 && lines[item.Index + 1].Contains(targetKeyword)) { // 返回插入内容 + 当前行 return insertLines.Concat(new[] { item.Line }); } // 无匹配则仅返回当前行 return new[] { item.Line }; }) .ToList(); // 如需覆盖原文件,执行以下代码 // File.WriteAllLines(buildOutFile, result);
方案2:仅处理第一个匹配的目标行
和你原代码逻辑完全一致,只对第一个找到的目标行进行插入操作:
var lines = File.ReadAllLines(buildOutFile).ToList(); var targetIndex = lines.FindIndex(line => line.Contains("arr ff_test")); var insertLines = new[] { "West: &West", " **arr ff_test**", "DcName RD1" }; var result = targetIndex > 0 ? lines.Take(targetIndex - 1) .Concat(insertLines) .Concat(lines.Skip(targetIndex - 1)) .ToList() : lines.ToList();
代码说明
- 用
Select((line, index))获取每行的内容与索引,方便判断位置关系 SelectMany/Concat用来实现"插入内容"的效果,将单个元素扩展为多个元素- 生成新集合而非修改原集合,更符合LINQ的函数式编程风格
- 添加了索引越界判断,避免目标行在第一行时出现错误
内容的提问来源于stack exchange,提问作者Sravani
相关产品推荐
相关产品推荐

