You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改C# LinQ语句为List转CSV时的string字段添加双引号

问题描述

我认为我的问题并非重复提问,我并非询问如何将List转换为CSV,而是在将List转换为逗号分隔的CSV文件时,遇到部分字段包含逗号和分号的情况,导致单个列被拆分为至少两列。

我的代码:

public void SaveToCsv<T>(List<T> listToBeConverted)
{
    var lines = new List<string>();
    IEnumerable<PropertyDescriptor> props = TypeDescriptor.GetProperties(typeof(T)).OfType<PropertyDescriptor>();
    //Get headers
    var header = string.Join(",", props.ToList().Select(x => x.Name)); 
    //Add all headers
    lines.Add(header);
    //LinQ to get all row data and add commas to serperate them
    var valueLines = listToBeConverted.Select(row => string.Join(",", header.Split(',').Select(a => row.GetType().GetProperty(a).GetValue(row, null))));
    //add row data to List
    lines.AddRange(valueLines);
    ...
}

请问如何修改上述LinQ语句,为System.String类型的字段首尾添加双引号?


解决方案

直接修改LinQ部分,判断属性值类型是否为字符串,若是则用双引号包裹,同时要转义字符串内部的双引号(CSV标准规则),避免解析出错。另外建议直接复用之前的props集合,不用通过表头拆分再取属性,更高效稳妥。

修改后的代码如下:

var valueLines = listToBeConverted.Select(row => string.Join(",", 
    props.Select(prop => 
    {
        var value = prop.GetValue(row);
        if (value is string strValue)
        {
            // 转义内部双引号后包裹双引号
            return $"\"{strValue.Replace("\"", "\"\"")}\"";
        }
        // 非字符串类型直接转字符串输出,空值处理为空字符串
        return value?.ToString() ?? string.Empty;
    })
));

补充说明:

  • 对字符串字段,用Replace("\"", "\"\"")转义内部双引号是CSV的标准要求,否则解析时会识别错误
  • 双引号包裹后,即使字段内容包含逗号、分号,CSV解析器也会将其视为单个列的内容

内容的提问来源于stack exchange,提问作者AsM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:25:21