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
相关产品推荐
相关产品推荐

