如何将C#模型集合转置为竖表头横值的CSV格式
如何将C#模型集合转换为左侧表头、值横向排列的CSV格式
要把List<Header>这类模型集合转换成表头在左侧、对应值横向排列的CSV,核心思路是通过反射获取模型属性,再按属性遍历生成每行内容。以下是具体实现:
完整代码示例
using System; using System.Collections.Generic; using System.Reflection; public record Header { public string BlNo; public string Descr; public int sigVal; } class Program { static void Main() { var header = new Header { BlNo = "001", Descr = "test1", sigVal = 34 }; var header2 = new Header { BlNo = "002", Descr = null, sigVal = 38 }; var header3 = new Header { BlNo = "003", Descr = "test3", sigVal = 25 }; var headers = new List<Header> { header, header2, header3 }; // 获取模型的所有公共实例属性 var properties = typeof(Header).GetProperties(BindingFlags.Public | BindingFlags.Instance); var csvLines = new List<string>(); foreach (var prop in properties) { // 每行开头留空,接着是属性名 var lineSegments = new List<string> { "", prop.Name }; foreach (var item in headers) { var value = prop.GetValue(item); string formattedValue; if (value == null) { formattedValue = ""; } else if (value is string str) { // 转义字符串中的双引号,符合CSV标准格式 formattedValue = $"\"{str.Replace("\"", "\"\"")}\""; } else { // 非字符串类型直接转为字符串 formattedValue = value.ToString(); } lineSegments.Add(formattedValue); } csvLines.Add(string.Join(",", lineSegments)); } // 生成最终CSV内容并输出 var csvResult = string.Join(Environment.NewLine, csvLines); Console.WriteLine(csvResult); } }
运行结果
运行上述代码后,会输出符合需求的CSV内容:
,BlNo,"001","002","003" ,Descr,"test1",,"test3" ,sigVal,34,38,25
关键细节说明
- 反射获取属性:通过
typeof(Header).GetProperties()获取模型的所有公共实例属性,无需硬编码属性名,适配模型变更。 - 值格式化:
- 空值直接输出空字符串
- 字符串用双引号包裹,同时将字符串内部的双引号替换为两个双引号(CSV标准转义规则),避免解析错误
- 数值等非字符串类型直接转字符串输出
- 扩展适配:如果需要处理更多数据类型(如
DateTime、decimal),可在值格式化逻辑中添加对应类型的处理代码,定制输出格式。
内容的提问来源于stack exchange,提问作者Blingers
相关产品推荐
相关产品推荐

