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

将数组拆分为列表的列表时遇索引越界异常求助

解决数组拆分时的索引越界异常

嘿,我来帮你排查这个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:50:32