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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:39