遍历C#中的列表值并将其保存到CSV

问题描述 投票:0回答:1

我在这里做错了,也许您可​​以帮忙。

我想要实现的是:

  1. 读取CSV文件(基于ID,仅一行),并将属性值映射到对象。
  2. 更新对象的值。
  3. 将更新的值写回CSV文件。

我可以完成第一步和第二步。

例如,这是我定义映射到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;

我看到它们时可以在csvLine中看到更新的值。

最后,我尝试遍历列表(csvList),获取值并在这些值之间放入分号:

var sb = new StringBuilder();

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

但是这是我面临的问题。当我尝试查看StringBuilder的内容时,得到的只是对象名称(CSVProcessor.CSVData),而不是属性值:

var result = sb.ToString();

为什么会这样?

想法是形成一个字符串(新行),然后将其保存为CSV。

c# linq csv stringbuilder
1个回答
0
投票

之所以会这样,是因为StringBuilder使用对象的ToString方法将其转换为字符串。 ToString的默认行为(继承自object)是返回类型名称。

您必须创建用分号分隔的字符串,例如与:

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

您也可以覆盖ToString类中的CSVData

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

然后使用

Append(item);
© www.soinside.com 2019 - 2024. All rights reserved.