【问题标题】:Insert multiple lines into file from position without overwriting the previous inserted line从位置将多行插入文件而不覆盖先前插入的行
【发布时间】:2021-11-14 23:15:17
【问题描述】:

我想使用 foreach 循环(在列表上循环)将多个“项目”插入到列表中。现在我想将这些行作为<td> 元素插入。但是通过在我要插入行的位置指定索引,前一个会被覆盖。如何在位置添加一行,然后在不覆盖之前添加的行的情况下添加其余行

private void Create_Driver_Report(string npcName)
{

    var fileName = Get_Path("Driver_Reports.html");
    var endTag = npcName;
    var lineToAdd = "<!--New Line Here-->";
    var htmlContent = File.ReadAllLines(fileName).ToList();
    var index = htmlContent.FindIndex(x => x.Contains(lineToAdd));
           
    htmlContent.Insert(index + 1, endTag);          
    File.WriteAllLines("drivers.html", htmlContent);
}

理论上我想怎么做

foreach (Drivers item in drivers)
{
    Create_Driver_Report($"<td>{item.Driver_ID}</td>");
    Create_Driver_Report($"<td>{item.Driver_Name}</td>");
    Create_Driver_Report($"<td>{item.Vehicle_ID}</td>");
    Create_Driver_Report($"<td>{item.Company_ID}</td>");
    Create_Driver_Report($"<td>{item.Company_Name}</td>");                
}           

【问题讨论】:

  • Insert 不会覆盖。但是,您每次都插入到相同的确切索引,所以也许这就是您认为它覆盖该行的原因。如果你只是增加你的索引,它将在前一个之后插入。
  • 我知道这就是它发生的原因,但是如果我使用 foreach 循环,只会添加最后一个属性,所以这就是我问的原因,我想一次添加所有属性
  • 这很混乱。你能解释一下你的目的到底是什么吗?例如,您能否解释一下您提到的两个文件的作用:Driver_Reports.htmldrivers.html?您能否详细说明占位符"&lt;!--New Line Here--&gt;" 的作用?
  • 所以 driver_reports.html 是我用于 pdf 文档的模板,drivers.html 是“更新的模板”,然后“” 有点像我想在其中插入新行的索引
  • Driver_Reports.html 是您填写的某种模板,drivers.html 是保存由该模板制成的驱动程序集合的目标文件吗?

标签: c# wpf file-handling


【解决方案1】:

重写 ToString() 方法或创建一个新方法。 如果你总是想插入相同的属性,似乎没有必要一遍又一遍地调用Create_Driver_Report

public override String ToString() {
        return
            $"<td>{this.Driver_ID}</td>\n" +
            $"<td>{this.Driver_Name}</td>\n" +
            $"<td>{this.Vehichle_ID}</td>\n" +
            $"<td>{this.Company_ID}</td>\n" +
            $"<td>{this.Company_Name}</td>";
    }

你可以像这样调用它:

foreach (Drivers item in drivers) {
    Create_Driver_Report(item.ToString());
}

编辑: 选项 1:
使用 LINQ Select() 和 List.InsertRange()

public String ToHtmlRow() {
    return
        $"<tr><td>{this.Driver_ID}</td><td>{this.Driver_Name}</td><td>{this.Vehichle_ID}</td><td>{this.Company_ID}</td><td>{this.Company_Name}</td></tr>";
}

{
  IEnumerable<string> lines = drivers.Select(driver => driver.ToString())
  Create_Driver_Report(lines);
}

static void Create_Driver_Report(IEnumerable<string> lines) {
    var fileName = Get_Path("Driver_Reports.html");
    var lineToAdd = "<!--New Line Here-->";
    var htmlContent = File.ReadAllLines(fileName).ToList();
    var index = htmlContent.FindIndex(x => x.Contains(lineToAdd));
    
    htmlContent.InsertRange(index + 1, lines);
    File.WriteAllLines("drivers.html", htmlContent);
}

选项 2: 您只需添加所需的所有行,然后只调用一次Create_Driver_Report

List<String> toAdd = new List<String>();
foreach (Drivers item in drivers) {
    toAdded.Add(item.ToHtmlRow());
}

Create_Driver_Report(String.Join("\n", toAdd));

【讨论】:

  • 如果我在列表中添加 2 个具有不同信息的驱动程序,这仍然有效吗
  • 必须稍微修改一下,但是可以。它会起作用的。
  • 需要修改什么?我想避免编写冗余代码
  • 感谢您的回答,它完美无缺
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2020-01-19
  • 2020-07-25
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
相关资源
最近更新 更多