Вставьте несколько строк в файл с позиции, не перезаписывая предыдущую вставленную строку

#c# #wpf #file-handling

Вопрос:

Я хочу вставить несколько «элементов» в список, используя цикл foreach(зацикливание на списке). Теперь я хочу вставить строки в качестве lt;tdgt; элемента. Но, указав индекс в позиции, в которую я хочу вставить строку, предыдущая будет перезаписана. Как я могу добавить строку в позицию, а затем добавить остальные, не перезаписывая ранее добавленную строку

 private void Create_Driver_Report(string npcName) {   var fileName = Get_Path("Driver_Reports.html");  var endTag = npcName;  var lineToAdd = "lt;!--New Line Here--gt;";  var htmlContent = File.ReadAllLines(fileName).ToList();  var index = htmlContent.FindIndex(x =gt; x.Contains(lineToAdd));    htmlContent.Insert(index   1, endTag);   File.WriteAllLines("drivers.html", htmlContent); }  

Как я хочу это сделать в теории

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

Комментарии:

1. Insert не перезаписывается. Однако вы каждый раз вставляете один и тот же точный индекс, так что, возможно, именно поэтому вы думаете, что это перезапись строки. Если вы просто увеличите свой индекс, он будет вставлен после предыдущего.

2. Я знаю, почему это происходит, но если я использовал цикл foreach, добавляется только последнее свойство, поэтому я спросил, я хочу добавить их все сразу

3. Это сбивает с толку. Не могли бы вы объяснить, в чем именно заключается ваша цель? Например, не могли бы вы объяснить роль двух файлов, которые вы упомянули: Driver_Reports.html и drivers.html ? Не могли бы вы подробнее рассказать о роли заполнителей "lt;!--New Line Here--gt;" ?

4. Так что driver_reports.html это шаблон, который я использую для PDF-документа, drivers.html является ли «обновленный шаблон», а затем «lt;!—Новая строка здесь—gt;» своего рода индексом, в который я хочу вставить новые строки

5. Является Driver_Reports.html ли какой-то шаблон, который вы заполняете, и drivers.html файл назначения, в котором будет храниться коллекция драйверов, созданных на основе этого шаблона?

Ответ №1:

Переопределите метод toString() или создайте новый. Если вы всегда хотите вставлять одни и те же свойства, кажется ненужным вызывать Create_Driver_Report их снова и снова.

 public override String ToString() {  return  $"lt;tdgt;{this.Driver_ID}lt;/tdgt;n"    $"lt;tdgt;{this.Driver_Name}lt;/tdgt;n"    $"lt;tdgt;{this.Vehichle_ID}lt;/tdgt;n"    $"lt;tdgt;{this.Company_ID}lt;/tdgt;n"    $"lt;tdgt;{this.Company_Name}lt;/tdgt;";  }  

и вы можете вызвать его, как:

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

Редактировать: Вариант 1:
Используйте LINQ Select() и List.Вставка()

 public String ToHtmlRow() {  return  $"lt;trgt;lt;tdgt;{this.Driver_ID}lt;/tdgt;lt;tdgt;{this.Driver_Name}lt;/tdgt;lt;tdgt;{this.Vehichle_ID}lt;/tdgt;lt;tdgt;{this.Company_ID}lt;/tdgt;lt;tdgt;{this.Company_Name}lt;/tdgt;lt;/trgt;"; }  {  IEnumerablelt;stringgt; lines = drivers.Select(driver =gt; driver.ToString())  Create_Driver_Report(lines); }  static void Create_Driver_Report(IEnumerablelt;stringgt; lines) {  var fileName = Get_Path("Driver_Reports.html");  var lineToAdd = "lt;!--New Line Here--gt;";  var htmlContent = File.ReadAllLines(fileName).ToList();  var index = htmlContent.FindIndex(x =gt; x.Contains(lineToAdd));    htmlContent.InsertRange(index   1, lines);  File.WriteAllLines("drivers.html", htmlContent); }  

Вариант 2: Вы просто добавляете все нужные строки и вызываете Create_Driver_Report только один раз.

 Listlt;Stringgt; toAdd = new Listlt;Stringgt;(); foreach (Drivers item in drivers) {  toAdded.Add(item.ToHtmlRow()); }  Create_Driver_Report(String.Join("n", toAdd));  

Комментарии:

1. Будет ли это по-прежнему работать, если я добавлю 2 драйвера в список с другой информацией

2. Придется немного изменить, но да. Это сработало бы.

3. Что нужно будет изменить? Я хочу избавиться от необходимости писать избыточный код

4. Я ценю ваш ответ, он работает безупречно