Циклический просмотр значений списка в C# и сохранение их в CSV - PullRequest
0 голосов
/ 01 апреля 2020

Я делаю что-то здесь не так, и, возможно, вы могли бы помочь.

Я пытаюсь достичь:

  1. Прочитать файл CSV (только одна строка, на основе идентификатора) и сопоставьте значения свойств с объектом.
  2. Обновите значения объекта.
  3. Запишите обновленные значения обратно в файл CSV.

Я могу выполнить sh первый и второй шаг.

Например, вот как я определяю объект, который сопоставляется с полями CSV:

    public string Property1 { get; set; } = string.Empty;
    public string Property2 { get; set; } = string.Empty; 

    public static CSVData ReadFromCSV(string line)
    {
        string[] values = line.Split(';');
        CSVData csvValues = new CSVData();

        csvValues.Property1 = values[0];
        csvValues.Property2 = values[1];

        return csvValues;
    }

Затем я вызываю метод ReadFromCSVMethod следующим образом:

id = "123456";

var csvLine = File.ReadAllLines("C:\\test.csv")
             .Skip(1)
             .Select(line => CSVData.ReadFromCSV(line))
             .Where(i => i.ID == id)
             .ToList();

// update values
csvLine[0].Property1 = "foo";
csvLine[1].Property2 = "bar;

I при просмотре я могу видеть обновленные значения в csvLine.

Наконец, я пытаюсь l oop просмотреть список (csvList), взять значения и поставить точку с запятой между этими значениями:

var sb = new StringBuilder();

foreach (var item in csvList)
{
   sb.Append(item);
}

Но тут я сталкиваюсь с проблемой. Когда я пытаюсь увидеть, что находится внутри StringBuilder, я получаю только имя объекта (CSVProcessor.CSVData), а не значения свойств:

var result = sb.ToString();

Почему это происходит?

Идея сформировать строку (новую строку) и затем сохранить ее в CSV.

1 Ответ

1 голос
/ 01 апреля 2020

Это происходит потому, что StringBuilder использует метод ToString вашего объекта для преобразования его в строку. Поведение по умолчанию ToString (унаследованное от object) - возвращать имя типа.

Вы должны создать строку, разделенную точкой с запятой, например, с помощью:

sb.Append(item.Property1).Append(';').Append(item.Property2);

Вы можете также переопределите ToString в CSVData классе:

public override string ToString()
{
    return Property1 + ";" + Property2;
}

, а затем используйте

Append(item);
...