C#中如何从行列非连续的二维数组中访问元素
实现思路
核心是先建立角度到数组索引的映射关系,不用每次计算,直接通过角度快速定位索引,再取对应值。
步骤1:存储角度与索引的映射
读取文件时,同步记录垂直角度(行)和水平角度(列)的列表,然后用字典建立角度到索引的映射:
// 假设读取到的垂直角度列表(比如[1,6,11,...,180]) List<int> verticalAngles = new List<int>(); // 读取到的水平角度列表(比如[0,5,10,...,360]) List<int> horizontalAngles = new List<int>(); // 建立映射字典 Dictionary<int, int> verticalAngleToIndex = verticalAngles.Select((angle, idx) => new { angle, idx }) .ToDictionary(x => x.angle, x => x.idx); Dictionary<int, int> horizontalAngleToIndex = horizontalAngles.Select((angle, idx) => new { angle, idx }) .ToDictionary(x => x.angle, x => x.idx);
步骤2:快速取值
有了映射字典后,直接通过目标角度获取索引,再从二维数组取值:
// 假设已经填充好的二维数据数组 double[,] dataArray = new double[verticalAngles.Count, horizontalAngles.Count]; // 目标角度 int targetVertical = 3; int targetHorizontal = 20; // 取值 if (verticalAngleToIndex.ContainsKey(targetVertical) && horizontalAngleToIndex.ContainsKey(targetHorizontal)) { int row = verticalAngleToIndex[targetVertical]; int col = horizontalAngleToIndex[targetHorizontal]; double value = dataArray[row, col]; // 处理获取到的值 } else { // 处理目标角度不存在的情况,比如抛出异常或返回默认值 }
额外优化
- 如果存在角度不严格匹配的场景(比如要找最接近3度的角度),可以通过遍历角度列表找差值最小的项:
int closestVertical = verticalAngles.OrderBy(a => Math.Abs(a - targetVertical)).First(); int row = verticalAngleToIndex[closestVertical];
- 可以把映射逻辑封装成一个工具类,复用在不同文件的处理流程中。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

