使用CSVHelper时能否用元组写入CSV文件?
使用CSVHelper处理值元组写入CSV的方案
CSVHelper完全支持值元组(包括具名值元组和普通值元组),用值元组替代类实例确实能有效降低内存占用——毕竟值元组是值类型,无需额外的堆内存分配,适合处理大量数据的场景。
基础写入示例
具名值元组(推荐)
具名值元组的字段名会自动作为CSV表头,无需额外配置:
var records = new List<(int Id, string UserName, DateTime RegisterDate)> { (101, "Alice", new DateTime(2024, 3, 15)), (102, "Bob", new DateTime(2024, 3, 16)) }; using (var writer = new StreamWriter("users.csv")) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteRecords(records); }
生成的CSV表头会是Id,UserName,RegisterDate。
普通值元组
如果使用无名称的普通值元组,默认表头会是Item1,Item2,Item3这类命名:
var records = new List<(int, string, DateTime)> { (101, "Alice", new DateTime(2024, 3, 15)), (102, "Bob", new DateTime(2024, 3, 16)) }; using (var writer = new StreamWriter("users.csv")) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteRecords(records); }
自定义表头
不管是具名还是普通值元组,都可以通过RegisterClassMap来自定义表头:
using (var writer = new StreamWriter("users.csv")) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { // 针对具名值元组映射自定义表头 csv.Context.RegisterClassMap<(int Id, string UserName, DateTime RegisterDate)>(map => { map.Map(m => m.Id).Name("用户ID"); map.Map(m => m.UserName).Name("用户名"); map.Map(m => m.RegisterDate).Name("注册日期"); }); csv.WriteRecords(records); }
如果是普通值元组,直接映射ItemX即可:
csv.Context.RegisterClassMap<(int, string, DateTime)>(map => { map.Map(m => m.Item1).Name("用户ID"); map.Map(m => m.Item2).Name("用户名"); map.Map(m => m.Item3).Name("注册日期"); });
自定义格式化
针对日期、数字等类型的格式化需求,同样在映射时通过TypeConverterOption配置:
var records = new List<(int OrderId, decimal Amount, DateTime OrderTime)> { (2001, 129.995m, new DateTime(2024, 3, 15, 14, 30, 0)), (2002, 89.5m, new DateTime(2024, 3, 16, 9, 15, 0)) }; using (var writer = new StreamWriter("orders.csv")) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.Context.RegisterClassMap<(int OrderId, decimal Amount, DateTime OrderTime)>(map => { map.Map(m => m.OrderId).Name("订单ID"); // 金额保留两位小数 map.Map(m => m.Amount).Name("订单金额").TypeConverterOption.Format("F2"); // 日期格式化为yyyy-MM-dd HH:mm map.Map(m => m.OrderTime).Name("下单时间").TypeConverterOption.Format("yyyy-MM-dd HH:mm"); }); csv.WriteRecords(records); }
版本说明
主流版本的CSVHelper(v20及以上)都完美支持值元组,如果你在用更早的版本,建议升级到最新稳定版以获得完整支持。
内容的提问来源于stack exchange,提问作者herme 0
相关产品推荐
相关产品推荐

