如何调用扩展方法以从数组中删除项目

时间:2018-10-04 16:10:28

标签: c#

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

public static void Remove<TSource>(this ICollection<TSource> source, Func<TSource, bool> predicate)

我正在尝试在数组上调用此方法。该数组名为Items,是节的属性

section.Items.Remove(// what goes here?)

商品是一系列产品。

为清楚起见,这是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);
            }
        }
    }

1 个答案:

答案 0 :(得分:8)

您需要传递一个lambda来过滤要删除的内容(如果参数和函数的名称是逻辑的)

例如:

SELECT (SELECT token +'.'
        FROM dbo.NGrams8k('DOG',1)
        ORDER BY position
        FOR XML PATH(''))

这应该删除ID为1的所有项目(假设存在这样的属性)

注意,由于无法调整数组大小,因此很难确切说明该方法的作用。该方法采用section.Items.Remove(p => p.Id == 1); ,可以删除项目,但是您说您传入了数组。调用ICollection时,该数组将产生错误。

修改

自从您发布了该方法的代码以来,我可以肯定地说该方法对于数组将失败。它将适用于其他ICollection.Remove实现(例如ICollection)。

只需指出,我不会真正使用此方法来删除大型集合中的许多元素,因为该方法将再次迭代该集合以删除每个对象。更不用说它将分配一个新的数组来复制整个集合(大型集合的噩梦)。