c# collection.RemoveAll(collection.OfType<type>());

本文关键字:collection gt type RemoveAll lt OfType | 更新日期: 2023-09-27 18:16:36

我可以这样做吗:

collection.RemoveAll(collection.OfType<type>());

从集合中删除给定类型的所有元素?

c# collection.RemoveAll(collection.OfType<type>());

两个已经提交的答案都是正确的,但是省略了一个解释为什么海报的示例代码不能工作。有几个有趣的地方:

首先,RemoveAll()ICollectionICollection<T>接口中没有定义;例如,它是在List<T>上定义的,但在HashSet<T>上语义等效的方法称为RemoveWhere()。如果您希望能够为任何ICollection<T>做到这一点,您应该编写一个扩展方法。

第二,问题的示例代码传递要从集合中删除的项目序列,但是List<T>.RemoveAll()HashSet<T>.RemoveWhere()使用谓词来标识要删除的项目(如其他答案所示)。您可以编写扩展方法来采用另一种方法,并像示例中一样传递IEnumerable<T>。但是,您需要小心,因为您不能这样做:

foreach (var item in collection)
    if (ShouldRemove(item))
        collection.Remove(item);

如果您尝试这样做,您应该得到一个InvalidOperationException,其中包含类似于"Collection was modified;枚举操作不能执行。"

因为前两个代码回答特别使用了List,而第三个只有非工作代码:

ICollection collection = GetCollection();
foreach (object obj in collection.Where(obj => obj is type).ToList())
     collection.Remove(obj);

可以通过调用ToList来结束枚举,以便再次允许删除。但是,这是完全低效的,因为它需要一个枚举来获取对象,然后一个接一个地删除它们,可能每次都需要枚举。如果你使用的集合类型有它自己的方法,比如List.RemoveAll,那就用那些方法代替,但是你使用"collection"意味着你不知道它的类型。

或者,如果重要性不在于保留对象,则考虑重新赋值:

collection = collection.Where(obj => obj is type == false).ToList();

如果我理解正确的话,您有任何对象类型的单个集合,并且您希望从该集合中删除该类型的所有项。如果是,很简单:

objects.RemoveAll(q=>q.GetType()==typeof(YourType));

我会这样做:

收藏。RemoveAll(i => collection.OfType().Contains(i));
编辑:
 collection.RemoveAll(i => i is type);

collection.Clear()删除所有元素