使用List.RemoveRange移除元素时触发ArgumentOutOfRange异常求助
解决List调用RemoveRange时的ArgumentOutOfRangeException问题
这个报错的核心原因很明确:你传入RemoveRange的起始索引是负数!
当你的points集合元素数量小于8的时候,points.Count - 8就会变成负数,而RemoveRange要求第一个参数(起始索引)必须是非负整数,同时还要满足起始索引加上要删除的数量不超过集合总元素数,这就直接触发了ArgumentOutOfRangeException。
你提到集合原本有379个元素,但实际调用RemoveRange时,可能集合的元素数量已经被其他操作削减到不足8个了——比如构造函数里的循环只生成了28个元素,如果后续没有添加更多元素,或者有删除操作,那Count就可能小于8。
两种安全的解决方案:
方案1:先判断元素数量再执行删除
先检查集合元素是否足够8个,再调用RemoveRange,从根源避免索引负数的情况:
if (points.Count >= 8) { points.RemoveRange(points.Count - 8, 8); } // 可选处理:如果元素不足8个,你可以选择清空集合或者什么都不做 // else { points.Clear(); }
方案2:用Linq截取保留前N个元素
这种方式更简洁,不管集合有多少元素,都能安全地保留除最后8个之外的元素(如果元素不足8个就直接清空):
using System.Linq; // 需要引入Linq命名空间 // 取前(总元素数-8)个,若总元素数<8则取0个(即清空集合) points = points.Take(Math.Max(points.Count - 8, 0)).ToList();
额外提醒
调用RemoveRange时一定要注意两个参数的合法性:
- 起始索引
index必须满足0 ≤ index < points.Count - 要删除的数量
count必须满足index + count ≤ points.Count
内容的提问来源于stack exchange,提问作者kubaklamca
相关产品推荐
相关产品推荐

