#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. Я ценю ваш ответ, он работает безупречно