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

如何从CSV文件填充C#的List<string>类型二维路径矩阵?

实现方案

一、CSV文件读取填充路径矩阵的实现

你可以结合CSV解析库+JSON数组解析实现动态加载,不需要硬编码路径数据。以下是可直接运行的实现方案:

前置依赖

  • 推荐使用CsvHelper处理CSV格式(避免自行处理转义、引号等边界问题),可通过NuGet安装:Install-Package CsvHelper
  • 用.NET自带的System.Text.Json解析单元格中的路径JSON数组

示例代码

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text.Json;
using CsvHelper;
using CsvHelper.Configuration;

public class RouteMatrixLoader
{
    public static Dictionary<string, Dictionary<string, List<string>>> LoadFromCsv(string filePath)
    {
        var config = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            AllowComments = false,
            HasHeaderRecord = true,
            TrimEntries = true
        };

        var routes = new Dictionary<string, Dictionary<string, List<string>>>();

        using var reader = new StreamReader(filePath);
        using var csv = new CsvReader(reader, config);
        
        // 读取表头,获取所有目标节点
        csv.Read();
        csv.ReadHeader();
        var targetNodes = csv.HeaderRecord[1..]; // 跳过第一个空表头

        // 逐行读取源节点和对应路径
        while (csv.Read())
        {
            string sourceNode = csv.GetField(0);
            var targetRouteDict = new Dictionary<string, List<string>>();

            for (int i = 0; i < targetNodes.Length; i++)
            {
                string pathJson = csv.GetField(i + 1);
                // 解析JSON数组为路径列表
                var path = JsonSerializer.Deserialize<List<string>>(pathJson) ?? new List<string>();
                targetRouteDict.Add(targetNodes[i], path);
            }

            routes.Add(sourceNode, targetRouteDict);
        }

        return routes;
    }
}

// 调用示例
var routes = RouteMatrixLoader.LoadFromCsv("你的CSV文件路径.csv");
var hA2hCRoute = routes["hA"]["hC"]; // 输出 ["hA","hB","hC"]

如果你不想引入第三方库,也可以自行处理CSV解析,但要注意单元格内的JSON数组包含逗号、引号的转义场景,避免直接用Split(',')拆分出错。

二、更合适的存储类型说明

你当前用的Dictionary<string, Dictionary<string, List<string>>>已经是兼顾易用性和查询性能的选择,完全支持routes["源"]["目标"]的查询写法,时间复杂度为O(1)。如果需要更高的封装性和可维护性,可以在此基础上封装自定义类:

public class RouteMatrix
{
    private readonly Dictionary<string, Dictionary<string, List<string>>> _innerMatrix;

    public RouteMatrix(Dictionary<string, Dictionary<string, List<string>>> innerMatrix)
    {
        _innerMatrix = innerMatrix;
    }

    // 自定义索引器,支持更友好的查询,还可添加参数校验、默认返回等逻辑
    public List<string> this[string source, string target]
    {
        get
        {
            if (!_innerMatrix.TryGetValue(source, out var targetDict) 
                || !targetDict.TryGetValue(target, out var path))
            {
                // 可根据需求返回空列表或抛自定义异常
                return new List<string>();
            }
            return path;
        }
    }

    // 可扩展添加节点、修改路径等方法
}

// 调用示例
var matrix = new RouteMatrix(routes);
var path = matrix["hA", "hC"];

其他可选方案比如二维数组,需要提前把节点映射为整数索引,查询时需要额外转换,易用性远低于字典方案,没有特殊需求不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:03