这是我从List
删除项目的方法。这是正确的方法吗?是否有更清洁/更快的方法来实现这一目标。
List<ItemClass> itemsToErase = new List<ItemClass>();
foreach(ItemClass itm in DS)
{
if(itm.ToBeRemoved)
itemsToErase .Add(itm);
}
foreach(ItemClass eraseItem in itemsToErase)
{
DS.Remove(eraseItem );
}
编辑:DS的类型为List<ItemClass>
LinkedList<ItemClass>
,该怎么办?没有RemoveAll()
。
答案 0 :(得分:2)
List.RemoveAll()有一个委托,您可以在其中添加比较功能。
E.g:
List<ItemClass> itemsToErase = new List<ItemClass>();
itemsToErase.RemoveAll( itm => itm.ToBeRemoved );
答案 1 :(得分:1)
不是真的,无论你怎么做,逻辑都是一样的。您无法同时迭代和修改集合。使用LINQ 看起来看起来更干净:
var list = new List<int> { 1, 2, 3, 4, 5 };
var except = new List<int> { 3, 4 };
var result = list.Except(except);
希望这有帮助。
编辑:即使 list.RemoveAll(...)
必须在内部维护两个列表才能执行此操作。
edit2:其实svick是对的;在查看实现后,RemoveAll是最快的。
答案 2 :(得分:1)
答案 3 :(得分:1)
此方法避免了原始列表中的大量副本,但具有更大的内存消耗。
List<ItemClass> newList = new List<ItemClass>(originalList.Count);
foreach(var item in originalList) {
if (!item.ToBeRemoved)
newList.Add(item);
}
originalList = newList;
答案 4 :(得分:0)
使用此方法
DS.RemoveAll(x => x.ToBeRemoved);
答案 5 :(得分:0)
您的代码是问题的常见解决方案,并且很好。特别是如果只有少数项目需要删除
正如其他人所建议的那样,您也可以创建一个包含要保留的项目的新列表,然后丢弃旧列表。如果大多数物品将被移除并且只保留少量物品,则效果会更好。
在选择这些方法中的任何一种时,请记住两者都需要分配新的列表对象。这个额外的内存分配可能不是问题,但可能是,这取决于代码的其余部分正在做什么
正如其他人提到的那样,还有RemoveAll方法。这就是我要使用的,它是整洁,清晰和有效的,因为使用列表的任何东西都可以
最后一个选项是使用索引循环遍历集合。 EG。
(对不起VB,我比C#经常使用它,并且不想因语法错误而混淆)
Dim i as Integer
Do While i<DS.Count
If DS.Item(i).ToBeRemoved Then
DS.RemoveAt(i)
Else
i+=1
End If
Loop