Java模拟迭代器从集合中删除对象

时间:2012-01-02 20:39:21

标签: c#

在Java中,我可以使用Iterator.remove()方法http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Iterator.html#remove()

迭代集合并从中删除一些对象

这非常自然而且很自然。就像你正在寻找冰箱里的食物,扔掉过期日期的食物。如何在c#中做同样的事情?

我想在同一个循环中收集iterateclean-up

有几个相关问题,例如How to iterate and update a list但是我仍然无法在c#

中找到此操作的确切副本

3 个答案:

答案 0 :(得分:7)

如果您正在使用List<T>,则可以使用方便的方法(RemoveAll),这将删除与谓词匹配的所有元素(表示为委托)。例如:

List<Person> people = ...;
people.RemoveAll(person => person.Age < 18);
// Just the adults left now...

这比向后迭代更简单,IMO。

当然,如果您乐意创建 new 列表,可以使用LINQ:

var adults = people.Where(person => person.Age >= 18).ToList();

答案 1 :(得分:2)

在C#中,您可以使用for循环来迭代集合,并在其中删除项目 - 这将适用于IList<T>个集合。

为安全起见,你应该向后迭代

for(int i = coll.Count - 1; i >= 0; i--)
{
  if(coll[i] == something)
  {
     coll.RemoveAt(i);
  }
}

如果您可以使用LINQ,请按照Jon Skeet的建议查看RemoveAll。这将允许您从列表中删除所有项目而无需迭代,只需提供谓词。

coll.RemoveAll(i => i == something);

答案 2 :(得分:2)

只需向后循环计数

List<string> collection = new List<String> { "Hello", "World", "One", "Two", "Three"};
collection.Dump("Original List");
for(int i = collection.Count-1; i>=0; i-- )
{
    if (collection[i] == "One"){
        collection.RemoveAt(i);
    }
}
collection.Dump("After deleting");

顺便说一句,这是来自Knuth books

的经典示例

编辑:此示例在LINQPad中运行良好 - 用于演示目的。转储()在VS中不起作用。