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

List<T>的RemoveAt方法未按指定索引删除,误删末尾元素求助

问题分析与修正

首先,你遇到的RemoveAt删错元素的核心原因是传参错误——在第二个条件分支里,你把元素值input[i + 1]当成了索引传给RemoveAt,而RemoveAt需要的是要删除元素的位置索引。比如如果input[i+1]的值刚好等于列表最后一个元素的索引(比如列表长度是3,元素值是2),就会误删最后一个元素。

除此之外,你的代码还有几个潜在问题:

  • 直接访问input[i + 2]没有做边界检查,会触发索引越界异常
  • 正向循环中频繁修改i的值(i--),结合列表元素的动态变化,很容易导致逻辑混乱,出现重复处理或遗漏元素的情况

修正后的实现思路

处理这种需要修改列表结构的场景,从后往前遍历会更安全——因为删除后面的元素不会影响前面未遍历元素的索引位置,避免了索引混乱的问题。我们可以这样实现相邻相等元素的求和合并:

private static int GetNumberFromInput(List<int> input)
{
    // 从倒数第二个元素开始往前遍历,确保i+1始终是有效索引
    for (int i = input.Count - 2; i >= 0; i--)
    {
        // 检查当前元素和下一个元素是否相等
        if (input[i] == input[i + 1])
        {
            int sum = input[i] + input[i + 1];
            // 删除下一个元素(传入正确的索引i+1)
            input.RemoveAt(i + 1);
            // 将当前元素替换为求和结果
            input[i] = sum;
        }
    }

    // 根据需求返回结果:这里返回最终列表的最后一个元素,空列表则返回0
    return input.Count > 0 ? input[input.Count - 1] : 0;
}

关键说明

  1. 反向遍历:从input.Count - 2开始,天然避免了i+1越界的问题,无需额外的边界判断
  2. 正确使用RemoveAt:明确传入要删除元素的索引i+1,彻底解决删错元素的问题
  3. 简化逻辑:去掉了冗余的条件判断,只专注于相邻相等元素的合并,代码更易读和维护

如果你原本的需求是处理非相邻的相等元素,或者有其他特殊逻辑,可以再补充说明,我再帮你调整~

内容的提问来源于stack exchange,提问作者Nikolai Stoilkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:33:00