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

C#实现读取CSV生成列标题为键的Dictionary字典

问题说明

需求为将CSV文件加载到Dictionary<string, List<string>>结构中,区别于常规取CSV第一列作为字典键的实现,本次需要以CSV的列标题(字段名)作为字典键,对应值为该列所有行内容组成的列表。

测试用CSV内容

Name,Type,Classification
file1.txt,text,Secondary
file2.txt,text,Primary

目标字典结构

{
     "Name": ["file1.txt", "file2.txt"],
     "Type": ["text", "text"],
     "Classification": ["Secondary", "Primary"]
}
原有实现的性能缺陷

你后续补充的可运行版本存在明显的效率问题:处理每一列时,都会对所有数据行重新执行一次Split(',')操作。当CSV列数、行数较多时,会产生大量重复的字符串拆分计算,生成大量无用临时对象,时间、内存开销都会随列数增长线性升高。
你最开始写的初始化代码思路是正确的,只需要补充行遍历逻辑即可,不需要嵌套遍历列后再重复遍历所有行做拆分。

最优实现方案

核心优化思路:只遍历一次数据行,每行仅做一次拆分,拆分后按列索引将值直接追加到对应列的存储列表中,将原本O(M*N)次拆分操作(M为列数,N为行数)降低到O(N)次。

private void LoadCSV()
{
    var mydict = new Dictionary<string, List<string>>();
    var lines = File.ReadAllLines(@"C:\test.csv");
    if (lines.Length == 0) return;
    
    // 初始化列头对应的存储列表
    string[] columnHeaders = lines[0].Split(',');
    foreach (string columnHeader in columnHeaders)
    {
        mydict[columnHeader] = new List<string>();
    }

    // 单次遍历所有数据行
    for (int i = 1; i < lines.Length; i++)
    {
        string[] rowValues = lines[i].Split(',');
        // 按列索引将值存入对应列表
        for (int colIndex = 0; colIndex < columnHeaders.Length; colIndex++)
        {
            // 兼容行字段数不足的边界场景
            string value = colIndex < rowValues.Length ? rowValues[colIndex] : string.Empty;
            mydict[columnHeaders[colIndex]].Add(value);
        }
    }
}

注意事项

  • 上述实现仅适配无特殊转义规则的简单CSV场景,性能最优;如果CSV存在引号包裹字段、字段内容自带逗号/换行等复杂格式,不要手动用Split实现解析,直接使用成熟的CSV解析类库处理,避免出现解析错误。
  • 实现中增加了空文件、行字段数不足的边界判断,鲁棒性比原有版本更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:21:35