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