如何从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
相关产品推荐
相关产品推荐

