多维数组更新异常求助:仅保留最后更新值问题排查
问题排查:多维数组仅保留最后一次更新值
我正在处理一个维度基于用户输入的多维数组,复用了第三方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
相关产品推荐
相关产品推荐

