It seems impossible =)
CSV is a row-oriented structure. You need to reorganize your data.
For example, create a model that corresponds to your row:
public class ReportRow
{
[Description("Name 1")]
public string Column1 { get; set; }
[Description("Name 2")]
public string Column2 { get; set; }
[Description("Name 3")]
public string Column3 { get; set; }
}
In this case, the method that makes CSV string will be:
public static string DrawCsv(List<ReportRow> rows, bool showHeader = false)
{
var result = string.Empty;
if (showHeader)
{
var header = string.Empty;
var r = rows.First();
foreach (var prop in r.GetType().GetProperties())
{
DescriptionAttribute attr = (DescriptionAttribute)prop.GetCustomAttributes(typeof(DescriptionAttribute), true)[0];
header += attr.Description + "; ";
}
result += header.TrimEnd() + Environment.NewLine;
}
foreach (var row in rows)
{
var line = string.Empty;
foreach (var prop in row.GetType().GetProperties())
{
line += prop.GetValue(row) + "; ";
}
result += line.TrimEnd() + Environment.NewLine;
}
return result;
}
With DescriptionAttribute
you are able to avoid creating a special field for column naming.
Now we can test this:
var reportRows = new List<ReportRow>
{
new ReportRow { Column1 = "Lorem ipsum 1", Column2 = "dolor sit 1", Column3 = "amet 1" },
new ReportRow { Column1 = "Lorem ipsum 2", Column2 = "dolor sit 2", Column3 = "amet 2" },
new ReportRow { Column1 = "Lorem ipsum 3", Column2 = "dolor sit 3", Column3 = "amet 3" }
};
var str = DrawCsv(reportRows, true);
Result will be:
Name 1; Name 2; Name 3;
Lorem ipsum 1; dolor sit 1; amet 1;
Lorem ipsum 2; dolor sit 2; amet 2;
Lorem ipsum 3; dolor sit 3; amet 3;
I hope it helps you =)