C# 查看列表最简单的方法是什么<;T>;移除不需要的对象?

C# 查看列表最简单的方法是什么<;T>;移除不需要的对象?,c#,.net,generics,list,collections,C#,.net,Generics,List,Collections,在我的应用程序中,_collection是一个列表,我需要从中删除所有与标准不匹配的用户对象 但是,以下代码在其第二次迭代中获得了一个无效操作错误,因为_集合本身已更改: foreach (User user in _collection) { if (!user.IsApproved()) { _collection.Remove(user); } } 我可以创建另一个列表集合并来回复制它们,但是我会遇到非克隆引用类型的问题,等等 有没有比将集合复制到

在我的应用程序中,_collection是一个列表,我需要从中删除所有与标准不匹配的用户对象

但是,以下代码在其第二次迭代中获得了一个无效操作错误,因为_集合本身已更改:

foreach (User user in _collection)
{
    if (!user.IsApproved())
    {
        _collection.Remove(user);
    }
}
我可以创建另一个列表集合并来回复制它们,但是我会遇到非克隆引用类型的问题,等等

有没有比将集合复制到另一个列表变量更优雅的方法?

_collection.RemoveAll(user => !user.IsApproved());
如果您仍然使用2.0:

顺便说一下,如果您不想接触原始列表,您可以通过以下方式获得另一个已批准用户列表:

_collection.FindAll(user => user.IsApproved());

您始终可以从顶部索引开始,向下迭代到0:

for (int i = _collection.Count - 1; i >= 0; i--)
{
    User user = _collection[i];
    if (!user.IsApproved())
    {
        _collection.RemoveAt(i);
    }
}

Mehrdad的回答看起来非常优雅。

每当有可能在循环中修改集合时,请选择
for
循环。Mehrdad给出的解决方案很可爱,绝对值得一试

我发现以下代码在处理可修改集合时很有用:

for(int index=0;index < _collection.Count; index++)
{
    if (!_collection[index].IsApproved)
    {
        _collection.RemoveAt(index);
        index--;
    }
}
for(int index=0;index<\u collection.Count;index++)
{
如果(!\u集合[index].IsApproved)
{
_收集、删除(索引);
索引--;
}
}

这似乎包含一个bug。考虑具有两个元素的集合的情况,其中第一个元素未被批准。第一个被删除了,所以集合[1]超出了范围。史蒂文:在您描述的情况下,上面的代码可能已经检查了集合[1](在删除集合[0]后,它将成为集合[0]),因为它是自上而下迭代的。所以不应该有任何越界错误,没关系。再次浏览它,你会发现它没有问题。对于我们这些仍然使用.NET2.0的人来说,这个方法是最好的选择。@C-Pound专家:
List.RemoveAll
从2.0开始就存在了:
List.RemoveAll(委托(用户u){return!u.IsApproved();})
\u collection.FindAll(user=>user.IsApproved())以消除否定。_collection.FindAll将返回另一个集合。这与更改初始集合有很大的不同(在某些情况下,其他一些对象持有对同一列表的引用,您需要更改其中一个,而不是创建另一个)。
for(int index=0;index < _collection.Count; index++)
{
    if (!_collection[index].IsApproved)
    {
        _collection.RemoveAt(index);
        index--;
    }
}