从List <type> </type>中删除项目

时间:2011-11-19 15:42:42

标签: c#

这是我从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>

编辑:还有一个疑问。如果DS是LinkedList<ItemClass>,该怎么办?没有RemoveAll()

6 个答案:

答案 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)

您可以使用the RemoveAll() method

DS.RemoveAll(x => x.ToBeRemoved);

这是一个O(n)操作,你的代码是O(n ^ 2)。

答案 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