C#循环读取坐标文件填充二维数组报错,求正确实现方法
解决你的二维数组填充问题
首先,你眼前的报错是手误导致的语法错误:代码里写了sortedCoordinates[lines][[i],多打了一个左方括号,改成sortedCoordinates[lines][i]就能消除这个索引数量错误的提示。
不过除了这个语法问题,你的代码还有几个潜在的严重问题,得一起修正才能正常运行:
1. 类型不匹配 + 未初始化二维数组
你声明的sortedCoordinates是string[][]类型,但转换后的结果是int[],这会导致编译错误——整数数组不能直接赋值给字符串数组。首先要把变量类型修正为int[][]:
public int[][] sortedCoordinates; // 替换原来的string[][]
另外,你只声明了数组变量但没有初始化,直接赋值会触发空引用异常。在读取文件后,需要根据文件行数初始化这个二维数组:
coordinates = File.ReadAllLines(path); // 初始化:行数等于文件行数,每行用来存储8个整数 sortedCoordinates = new int[coordinates.Length][];
2. Parallel.For的线程安全问题
你在并行循环里直接操作全局的lines变量,多个线程会同时读写这个值,导致竞态条件——比如两个线程同时读取到相同的lines值,会覆盖同一行的数据,甚至引发索引越界。
其实完全不需要额外的lines变量,直接用Parallel.For提供的循环索引X就能定位二维数组的行,既简洁又避免线程安全问题:
Parallel.For(0, coordinates.Length, X => { string[] temp = coordinates[X].Split(); int[] tempInt = Array.ConvertAll(temp, int.Parse); // 直接把转换好的整数数组赋值给对应行,无需逐个元素赋值 sortedCoordinates[X] = tempInt; });
3. 可选:处理异常行(避免格式错误崩溃)
如果文件里某行的坐标个数不是8个,程序会报错。可以加个判断逻辑处理异常行:
Parallel.For(0, coordinates.Length, X => { // 拆分时移除空字符串,避免多余空格导致的数组长度异常 string[] temp = coordinates[X].Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); if (temp.Length != 8) { // 可以选择跳过、赋默认值或者记录日志 sortedCoordinates[X] = new int[8]; // 这里给默认值 return; } int[] tempInt = Array.ConvertAll(temp, int.Parse); sortedCoordinates[X] = tempInt; });
最终修正后的完整代码
public string[] coordinates; public int[][] sortedCoordinates; // 修正类型为int[][] public string path; // 记得给这个变量赋值文件路径 public void loadValues() { DateTime start = DateTime.Now; coordinates = File.ReadAllLines(path); // 初始化二维数组 sortedCoordinates = new int[coordinates.Length][]; Parallel.For(0, coordinates.Length, X => { string[] temp = coordinates[X].Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); // 处理格式异常的行 if (temp.Length != 8) { sortedCoordinates[X] = new int[8]; return; } int[] tempInt = Array.ConvertAll(temp, int.Parse); sortedCoordinates[X] = tempInt; }); // 可选:输出加载耗时 TimeSpan elapsed = DateTime.Now - start; Console.WriteLine($"坐标加载完成,耗时:{elapsed.TotalMilliseconds}ms"); }
总结一下,你最开始的报错是手误导致的,但还有类型不匹配、数组未初始化、线程安全这几个关键问题需要解决,上面的代码应该能稳定运行了。
内容的提问来源于stack exchange,提问作者FancyLord
相关产品推荐
相关产品推荐

