c# collection.RemoveAll(collection.OfType<type>());
本文关键字:collection gt type RemoveAll lt OfType | 更新日期: 2023-09-27 18:16:36
我可以这样做吗:
collection.RemoveAll(collection.OfType<type>());
从集合中删除给定类型的所有元素?
两个已经提交的答案都是正确的,但是省略了一个解释为什么海报的示例代码不能工作。有几个有趣的地方:
首先,RemoveAll()
在ICollection
或ICollection<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));
编辑:
collection.RemoveAll(i => i is type);
collection.Clear()
删除所有元素