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