将数组拆分为列表的列表时遇索引越界异常求助
解决数组拆分时的索引越界异常
嘿,我来帮你排查这个Index was out of range的问题!这种错误说白了就是你在访问数组元素时,用了一个不在有效范围内的索引值。结合你拆分UWeights数组的场景,大概率是这几个原因导致的:
- Noofelement数组的元素总和超过了UWeights的长度:比如
UWeights只有10个元素,但Noofelement里的数字加起来是12,那最后一次循环取元素时,必然会超出UWeights的边界。 - Noofelement里存在非正整数:如果某个元素是0或者负数,计算子数组范围时要么取到空数组(0长度),要么直接让索引变成负数,自然触发越界异常。
- 循环里的索引计算逻辑出错:比如
loopiteration的递增有问题,或者计算结束索引时没控制好,比如stindx + Noofelement[loopiteration]直接超过了UWeights的最大索引。
给你一个修正后的安全版本代码,我加了前置检查和更稳妥的子数组提取逻辑:
List<List<int>> unknownvalues = new List<List<int>>(); int stindx = 0; // 先做前置校验,提前规避问题 int totalNeeded = Noofelement.Sum(); if (totalNeeded > UWeights.Length) { throw new ArgumentException("Noofelement数组的元素总和超过了UWeights的元素数量!"); } if (Noofelement.Any(num => num <= 0)) { throw new ArgumentException("Noofelement数组里的每个元素都必须是正整数!"); } // 开始拆分数组 for (int loopiteration = 0; loopiteration < Noofelement.Length; loopiteration++) { int currentLength = Noofelement[loopiteration]; // 用Skip和Take提取子数组,不用手动算结束索引,更安全 List<int> subArray = UWeights.Skip(stindx).Take(currentLength).ToList(); unknownvalues.Add(subArray); // 更新起始索引 stindx += currentLength; }
如果你不想用LINQ的Skip和Take,也可以用手动遍历的方式,记得加边界检查:
List<List<int>> unknownvalues = new List<List<int>>(); int stindx = 0; // 同样先做前置校验 int totalNeeded = Noofelement.Sum(); if (totalNeeded > UWeights.Length || Noofelement.Any(num => num <= 0)) { throw new ArgumentException("输入参数不符合要求,请检查Noofelement数组!"); } for (int loopiteration = 0; loopiteration < Noofelement.Length; loopiteration++) { int currentLength = Noofelement[loopiteration]; // 每次循环都检查是否越界 if (stindx + currentLength > UWeights.Length) { throw new IndexOutOfRangeException($"第{loopiteration+1}次拆分时,剩余元素不足以满足指定长度!"); } List<int> subArray = new List<int>(currentLength); for (int i = 0; i < currentLength; i++) { subArray.Add(UWeights[stindx + i]); } unknownvalues.Add(subArray); stindx += currentLength; }
调试的时候可以加个断点,盯着stindx、currentLength和UWeights.Length这几个值,哪一次循环里stindx + currentLength超过了UWeights.Length,那就是问题的源头啦。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

