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

多维数组更新异常求助:仅保留最后更新值问题排查

问题排查:多维数组仅保留最后一次更新值

我正在处理一个维度基于用户输入的多维数组,复用了第三方DLL的部分逻辑方法,但遇到问题:多维数组wpValues仅保留最后一次更新的值,而非所有值都完成更新。例如当维度为3时,wpValues里只有第三组数据,导致后续计算结果错误。

代码示例

int size = fileDll.getArraySizeOp((int)Method.X); //size is 36
var getAllById = await _exampleRepository.GetAllById(id);
var getWPData = await _exampleWPRepository.GetById(id);
var duration = getWPData.Duration;
var convertOPDataToArray = getAllById.ToArray();
int dimension = convertOPDataToArray.Length;
float[] opValues = new float[size];
float[,] wpValues = new float[dimension, size];
Console.WriteLine($"Number of operations: {dimension}, size of each operation: {size}");
foreach (var item in convertOPDataToArray)
{
    Console.WriteLine("\n" +"=== Operation "+item.Oper_Id+" ===");
    opValues[0] = item.Frequency;
    Console.WriteLine($"Frequency: {opValues[0]}");
    opValues[1] = item.Frequency_Duration;
    Console.WriteLine($"Frequency_Duration: {opValues[1]}");
    opValues[2] = item.Vertical_Begin;
    Console.WriteLine($"Vertical_Begin: {opValues[2]}");

    // ... 省略其他opValues赋值逻辑

    opValues[34] = 0;
    opValues[35] = 0;

    fileDll.calculateOperation(opValues, duration);

    for (int i = 0; i < dimension; i++)
    {
        for (int j = 0; j < size; j++)
        {
            wpValues[i, j] = opValues[j];
        }
    }

}

wpResult = fileDll.calculateWorkplace(wpValues, dimension, size, duration);
Console.WriteLine($"Workplace result : {wpResult}");

问题根源

问题出在foreach循环内部的嵌套for循环:

for (int i = 0; i < dimension; i++)
{
    for (int j = 0; j < size; j++)
    {
        wpValues[i, j] = opValues[j];
    }
}

这段代码会在每次循环中,把wpValues的所有行(从第0行到第dimension-1行)都覆盖成当前的opValues数据。也就是说,每处理一组新数据,就会把之前所有行的数据都替换掉,最后所有行都只会保留最后一次循环的opValues。

修复方案

需要跟踪当前处理的是第几个操作项,只给对应的行赋值,而非覆盖所有行。有两种常见实现方式:

方式1:使用带索引的for循环替代foreach

// 替换原来的foreach循环
for (int currentIdx = 0; currentIdx < convertOPDataToArray.Length; currentIdx++)
{
    var item = convertOPDataToArray[currentIdx];
    Console.WriteLine("\n" +"=== Operation "+item.Oper_Id+" ===");
    opValues[0] = item.Frequency;
    Console.WriteLine($"Frequency: {opValues[0]}");
    opValues[1] = item.Frequency_Duration;
    Console.WriteLine($"Frequency_Duration: {opValues[1]}");
    opValues[2] = item.Vertical_Begin;
    Console.WriteLine($"Vertical_Begin: {opValues[2]}");

    // ... 省略其他opValues赋值逻辑

    opValues[34] = 0;
    opValues[35] = 0;

    fileDll.calculateOperation(opValues, duration);

    // 只给当前索引对应的行赋值
    for (int j = 0; j < size; j++)
    {
        wpValues[currentIdx, j] = opValues[j];
    }
}

方式2:在foreach中添加计数器

int currentIdx = 0;
foreach (var item in convertOPDataToArray)
{
    Console.WriteLine("\n" +"=== Operation "+item.Oper_Id+" ===");
    opValues[0] = item.Frequency;
    Console.WriteLine($"Frequency: {opValues[0]}");
    opValues[1] = item.Frequency_Duration;
    Console.WriteLine($"Frequency_Duration: {opValues[1]}");
    opValues[2] = item.Vertical_Begin;
    Console.WriteLine($"Vertical_Begin: {opValues[2]}");

    // ... 省略其他opValues赋值逻辑

    opValues[34] = 0;
    opValues[35] = 0;

    fileDll.calculateOperation(opValues, duration);

    // 只给当前计数器对应的行赋值
    for (int j = 0; j < size; j++)
    {
        wpValues[currentIdx, j] = opValues[j];
    }
    currentIdx++;
}

修复逻辑说明

修改后,每次处理一组操作数据时,只会将opValues的结果赋值到wpValues对应的行(currentIdx对应的行),不会覆盖之前已保存的其他行数据,这样wpValues就能正确存储所有操作组的结果,确保后续DLL计算逻辑能拿到完整数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:50:36