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

C#控制台应用中无法通过Action委托移除IList<T>对象的问题

问题原因

你遇到的System.InvalidOperationException是因为在foreach遍历集合的同时修改了集合本身——C#的枚举器不允许这种操作,一旦遍历期间集合的元素数量变化(比如添加/移除),枚举器就会抛出这个异常。

解决办法

你的GrowKale方法目的是移除所有元素,有几种简单的修复方式:

方法1:直接调用集合的Clear()方法(最简洁)

如果需求就是清空整个集合,没必要自己遍历移除,直接用List<T>自带的Clear()方法,高效又不会报错:

public static class Composter
{
    public static void GrowKale(this IList<Food> foods)
    {
        foods.Clear(); // 直接清空所有元素
    }    
}

方法2:遍历集合的副本

如果后续需要做更复杂的移除逻辑(不是清空全部),可以先把集合转成数组/列表副本,遍历副本的同时修改原集合:

public static class Composter
{
    public static void GrowKale(this IList<Food> foods)
    {
        // 转成数组副本,遍历副本不会受原集合修改影响
        foreach (var item in foods.ToArray())
        {
            foods.Remove(item);
        }           
    }    
}

方法3:用for循环从后往前遍历

如果需要按索引操作,从最后一个元素开始往前删,避免因为元素移除导致的索引偏移问题:

public static class Composter
{
    public static void GrowKale(this IList<Food> foods)
    {
        // 从最后一个元素开始倒序遍历
        for (int i = foods.Count - 1; i >= 0; i--)
        {
            foods.RemoveAt(i);
        }           
    }    
}
额外说明

你的Foods属性声明为IList<Food>,但实际实例是List<Food>,上面的方法都能兼容。如果只是需要清空集合,优先用Clear(),这是框架优化过的方法,性能最优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:20:42