使用 list<t>.removeall</t> 方法并传入匹配谓词是删除指定范围内元素最高效的做法。该方法会原地遍历列表,移除所有满足条件的元素,返回被移除的数量,无需手动处理索引偏移或创建新集合。对于数值类型,只需在谓词中定义范围边界即可。

RemoveAll 如何根据条件筛选并移除元素
RemoveAll 接受一个 Predicate<t></t> 委托,对列表中每个元素执行判断。如果委托返回 true,该元素即被移除。这种方法避免了在循环中调用 RemoveAt 导致的性能损耗和索引错误,因为内部实现会一次性完成元素的移动和计数更新。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 5, 10, 15, 20, 25, 30 };
// 删除 10 到 20 之间(包含边界)的元素
int removedCount = numbers.RemoveAll(n => n >= 10 && n <= 20);
Console.WriteLine($"Removed: {removedCount}");
Console.WriteLine(string.Join(", ", numbers));
}
}预期输出:
Removed: 3
1, 5, 25, 30
如何处理非连续范围或复杂逻辑的删除
当需要删除多个不连续区间或基于更复杂的逻辑时,可以在谓词中组合多个条件。例如,删除小于 5 或大于 25 的元素,等价于保留中间部分。这种写法依然保持单次遍历的高效性,且代码意图清晰。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 5, 10, 15, 20, 25, 30 };
// 删除不在 [5, 25] 范围内的元素
int removedCount = numbers.RemoveAll(n => n < 5 || n > 25);
Console.WriteLine($"Removed: {removedCount}");
Console.WriteLine(string.Join(", ", numbers));
}
}预期输出:
Removed: 2
5, 10, 15, 20, 25
删除操作后列表容量与内存变化
RemoveAll 仅减少 Count 属性,不会自动缩小底层数组的 Capacity。这意味着内存不会立即释放,但后续添加元素时无需重新分配大块内存。如果需要回收内存,可手动调用 Capacity = Count 或在初始化时使用 TrimExcess 相关逻辑,但在大多数场景下,保持容量不变有助于提升后续插入性能。


















