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

ala*_*ere 4 .net c# collections types set

我可以这样做:

collection.RemoveAll(collection.OfType<type>());
Run Code Online (Sandbox Code Playgroud)

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

pho*_*oog 7

两个已经提交的答案都是正确的,但省略了解释为什么海报的示例代码不起作用.一些有趣的观点:

首先,RemoveAll()在没有定义ICollectionICollection<T>接口; List<T>例如,它被定义,但是HashSet<T>调用了语义上等效的方法RemoveWhere().如果您希望能够为任何人执行此操作 ICollection<T>,则应编写扩展方法.

第二,这个问题的示例代码传递到被从集合中删除的项目的顺序,但List<T>.RemoveAll()HashSet<T>.RemoveWhere()采取谓词,以确定待除去的项(如图所示的其他的答案).您可以编写扩展方法以采用其他方法,并IEnumerable<T>在示例中传递as.但是,你需要小心,因为你不能这样做:

foreach (var item in collection)
    if (ShouldRemove(item))
        collection.Remove(item);
Run Code Online (Sandbox Code Playgroud)

如果您尝试这样做,您应该得到一个InvalidInvalidOperationException,其中包含"收集已被修改;枚举操作可能无法执行"之类的消息.


Joe*_*Joe 2

我会做这样的事情:

collection.RemoveAll(i => collection.OfType().Contains(i));


编辑:

 collection.RemoveAll(i => i is type);
Run Code Online (Sandbox Code Playgroud)

  • @JeffN825,也许他应该用汇编语言编写? (3认同)
  • 来吧......我不是性能狂......只是说有更多的性能方式来写这个。在您的示例中,它实际上循环遍历集合中每个项目的整个集合(n ^ 2 认为...)...您可以按照乔治的建议进行操作,它同样干净简单。如果您有 1000 个项目,那么您正在谈论进行一百万次迭代,而不是 1000 次。 (2认同)