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

C#中List遍历删除元素时循环跳过元素的问题求助

解决List循环删除元素时跳过元素的问题

我一眼就看出你遇到的问题了——当你用正序for循环遍历List并删除元素时,删除操作会导致后续元素向前移动一位,但你的循环变量i还在递增,这就会跳过下一个元素。比如,假设你删除了索引i的元素,原来索引i+1的元素现在到了索引i的位置,但下一次循环i变成i+1,就直接跳过了这个刚移过来的元素,这就是为什么你的输出里还有不符合条件的元素。

给你两种有效的解决方案:

方案1:倒序遍历删除

从List的最后一个元素开始往前遍历,这样即使删除当前元素,前面的元素位置不会受到影响(因为我们已经遍历过后面的了),不会出现跳过的情况:

else if(output == "Collapse")
{
    string val = Regex.Replace(des, "[^0-9]", "");
    int value = int.Parse(val);
    // 从最后一位开始倒序遍历
    for(int i = lst.Count - 1; i >= 0; i--)
    {
        int element = lst[i];
        if (element < value)
        {
            lst.RemoveAt(i);
        }
    }
}

方案2:使用List的RemoveAll方法(推荐)

List<T>内置了RemoveAll方法,可以一次性移除所有符合条件的元素,内部做了优化,代码更简洁,效率也更高:

else if(output == "Collapse")
{
    string val = Regex.Replace(des, "[^0-9]", "");
    int value = int.Parse(val);
    // 直接移除所有小于value的元素
    lst.RemoveAll(item => item < value);
}

针对你给出的测试输入:

输入序列:1 2 -1 0 -3 9 8 7 2
执行Collapse 8
执行Mort

用这两种方法都能得到预期的输出:9 8。

另外提个小细节:你的代码里int element = (int)lst[i];其实没必要强制转换,因为lst是List<int>,直接lst[i]就是int类型啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:57:45