C# 如何调用扩展方法从数组中删除项

C# 如何调用扩展方法从数组中删除项,c#,C#,在我继承的一个非常旧的代码库中,有一个具有此签名的方法 public static void Remove<TSource>(this ICollection<TSource> source, Func<TSource, bool> predicate) Items是一组产品 为了清楚起见,这里是Remove方法 public static void Remove<TSource>(this ICollection<TSource&

在我继承的一个非常旧的代码库中,有一个具有此签名的方法

public static void Remove<TSource>(this ICollection<TSource> source, Func<TSource, bool> predicate)
Items是一组产品

为了清楚起见,这里是Remove方法

    public static void Remove<TSource>(this ICollection<TSource> source, Func<TSource, bool> predicate)
    {
        var items = source.ToArray();
        for (var index = items.Length - 1; index >= 0; index--)
        {
            var item = items[index];
            if (predicate.Invoke(item))
            {
                source.Remove(item);
            }
        }
    }

如果参数和函数的名称是逻辑的,则需要传入lambda以过滤删除的内容

例如:

section.Items.Remove(p => p.Id == 1);
这将删除Id为1的所有项(假设存在此类属性)

请注意,由于数组无法调整大小,因此很难说该方法到底做了什么。该方法采用ICollection,可以移除项,但您可以说传入了一个数组。调用ICollection.Remove时,数组将给出一个错误

编辑

由于您发布了该方法的代码,我可以肯定地说,对于数组,该方法将失败。例如,它适用于其他ICollection实现列表


我要指出的是,我不会真正使用这个方法来删除大型集合中的大量元素,因为该方法将再次迭代集合以删除每个对象。更不用说它将分配一个新的数组来复制整个集合。对于大型集合,perf噩梦

如果参数和函数的名称是逻辑的,则需要传入lambda以过滤删除的内容

例如:

section.Items.Remove(p => p.Id == 1);
这将删除Id为1的所有项(假设存在此类属性)

请注意,由于数组无法调整大小,因此很难说该方法到底做了什么。该方法采用ICollection,可以移除项,但您可以说传入了一个数组。调用ICollection.Remove时,数组将给出一个错误

编辑

由于您发布了该方法的代码,我可以肯定地说,对于数组,该方法将失败。例如,它适用于其他ICollection实现列表


我要指出的是,我不会真正使用这个方法来删除大型集合中的大量元素,因为该方法将再次迭代集合以删除每个对象。更不用说它将分配一个新的数组来复制整个集合。对于大型集合,perf噩梦

顺便说一句,您不能从数组中删除项。只需将其称为集合而不是数组。顺便说一句,您不能从数组中删除项。只需将其称为集合而不是数组。我错了,它是传入的集合。这帮我搞错了一种洗液,它是一种传来的收藏品。这对我帮助很大